Domanda

ifstream::tellg() sta tornando -13 per un certo file.

In sostanza, ho scritto un programma di utilità che analizza qualche codice sorgente; Apro tutti i file in ordine alfabetico, comincio con "Apple.cpp" e funziona perfettamente .. Ma quando si arriva a "Conversion.cpp", sempre sullo stesso file, dopo aver letto una riga con successo tellg () restituisce -13.

Il codice in questione è:

for (int i = 0; i < files.size(); ++i) { /* For each .cpp and .h file */
   TextIFile f(files[i]);
   while (!f.AtEof()) // When it gets to conversion.cpp (not on the others)
                      // first is always successful, second always fails
      lines.push_back(f.ReadLine());

Il codice per AtEof è:

    bool AtEof() {
        if (mFile.tellg() < 0)
            FATAL(format("DEBUG - tellg(): %d") % mFile.tellg());
        if (mFile.tellg() >= GetSize())
            return true;

        return false;
    }

Dopo la si legge con successo la prima linea di Conversion.cpp, si blocca sempre con DEBUG - tellg(): -13.

Questa è tutta la classe TextIFile (scritto da me, l'errore può essere lì):

class TextIFile
{
public:
    TextIFile(const string& path) : mPath(path), mSize(0) {
        mFile.open(path.c_str(), std::ios::in);

        if (!mFile.is_open())
            FATAL(format("Cannot open %s: %s") % path.c_str() % strerror(errno));
    }

    string GetPath() const { return mPath; }
    size_t GetSize() { if (mSize) return mSize; const size_t current_position = mFile.tellg(); mFile.seekg(0, std::ios::end); mSize = mFile.tellg(); mFile.seekg(current_position); return mSize; }

    bool AtEof() {
        if (mFile.tellg() < 0)
            FATAL(format("DEBUG - tellg(): %d") % mFile.tellg());
        if (mFile.tellg() >= GetSize())
            return true;

        return false;
    }

    string ReadLine() {
        string ret;
        getline(mFile, ret);
        CheckErrors();
        return ret;
    }

    string ReadWhole() {
        string ret((std::istreambuf_iterator<char>(mFile)), std::istreambuf_iterator<char>());
        CheckErrors();
        return ret;
    }

private:
    void CheckErrors() {
        if (!mFile.good())
            FATAL(format("An error has occured while performing an I/O operation on %s") % mPath);
    }

    const string mPath;
    ifstream mFile;
    size_t mSize;
};

Piattaforma è Visual Studio, 32 bit, Windows.

Modifica:. Opere su Linux

Modifica: Ho trovato la causa: fine riga. Sia Conversione e Guid e altri avevano \ n invece di \ r \ n. Li ho salvati con \ r \ n, invece, e ha funzionato. Eppure, questo non dovrebbe accadere è vero?

È stato utile?

Soluzione

E 'difficile indovinare senza sapere esattamente cosa c'è in Conversion.cpp. Tuttavia, utilizzando < con posizioni di flusso non è definito dallo standard. Si potrebbe prendere in considerazione un cast esplicito al tipo intero corretto prima di formattazione; Non so che cosa la formattazione FATAL e format() si aspettano di eseguire o come l'operatore % è sovraccarico. posizioni stream non devono mappare in modo predicatable per gli interi, non certo se il file non viene aperto in modalità binaria.

Si potrebbe prendere in considerazione un'implementazione alternativa per AtEof(). Di 'qualcosa di simile:

bool AtEof()
{
    return mFile.peek() == ifstream::traits_type::eof();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top