Pagina 1 di 1

StreamBuffer

Inviato: sabato 27 settembre 2008, 23:12
da barone_birra
Mi aiutereste con questo pezzo di codice?

Devo modificare ciò (scusate la lunghezza del pezzo):

//=================================================================================================
// DIMACS Parser:

#define CHUNK_LIMIT 1048576

class StreamBuffer {
    gzFile  in;
    char    buf[CHUNK_LIMIT];
    int     pos;
    int     size;

    void assureLookahead() {
        if (pos >= size) {
            pos  = 0;
            size = gzread(in, buf, sizeof(buf)); } }

public:
    StreamBuffer(gzFile i) : in(i), pos(0), size(0) {
        assureLookahead(); }

    int  operator *  () { return (pos >= size) ? EOF : buf[pos]; }
    void operator ++ () { pos++; assureLookahead(); }
};

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

...

...

...


template
static void parse_DIMACS_main(B& in, Solver& S) {
    vec lits;
    for (;;){
        skipWhitespace(in);
        if (*in == EOF)
            break;
/*else if (match(in, "c START PROPERTIES")) {
           while (!match(in, "c END PROPERTIES")) {
    if (match(in, "c")) {
int v = parseInt(in);
reportf("Variabile Funzionalmente Dipendente:  X%-12d   \n", v);
//S.setDecisionVar(v, false);
skipLine(in);
}
}
}*/
        else if (*in == 'p'){
            if (match(in, "p cnf")){
                int vars    = parseInt(in);
                int clauses = parseInt(in);
                reportf("|  Number of variables:  %-12d                                         |\n", vars);
                reportf("|  Number of clauses:    %-12d                                         |\n", clauses);
            }else{
                reportf("PARSE ERROR! Unexpected char: %c\n", *in), exit(3);
            }
        } else if (*in == 'c' || *in == 'p')
            skipLine(in);
        else
            readClause(in, S, lits),
            S.addClause(lits);
    }
}

// Inserts problem into solver.
//
static void parse_DIMACS(gzFile input_stream, Solver& S) {
    StreamBuffer in(input_stream);
    parse_DIMACS_main(in, S); }


//=================================================================================================

In pratica dopo aver chiamato "parse_DIMACS_main(in, S);", dovrei chiamare un secondo metodo sempre sui "in" che effettua un secondo passaggio di parsing con operazioni diverse.
Ho provato una soluzione, che compila, ma non funziona come dovrebbe. Temo, anzi sono sicuro, che quando chiamo il secondo metodo lo StreamBuffer si trova alla fine del file e quindi non legge nulla.
Purtoppo con il c/c++ non sono un fenomeno e non riesco a capire dove devo agire.

Chiedo umilmente il vostro aiuto..  (b2b)

Re: StreamBuffer

Inviato: domenica 28 settembre 2008, 16:53
da barone_birra
nada?  :'(

[Risolto] Re: StreamBuffer

Inviato: lunedì 29 settembre 2008, 15:07
da barone_birra
Ok, ho risolto..

Usare il metodo gzrewind(stream buffer)  (z)