Frage

ifstream::tellg() zurückkehrt -13 für eine bestimmte Datei.

Im Grunde habe ich ein Programm, das einige Quellcodeanalysen; Ich öffne alle Dateien alphabetisch, beginne ich mit „Apple.cpp“ und es funktioniert perfekt .. Aber wenn es kommt zu „Conversion.cpp“, immer auf der gleichen Datei, nachdem eine Zeile erfolgreich tellg () zurückkehrt Lesen -13.

Der Code in Frage lautet:

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());

Der Code für AtEof ist:

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

        return false;
    }

Nachdem er erfolgreich die erste Zeile des Conversion.cpp liest, stürzt immer mit DEBUG - tellg(): -13.

Das ist die ganze TextIFile Klasse (schrieb von mir, der Fehler kann es sein):

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;
};

Plattform ist Visual Studio, 32 bit, Windows.

Edit:. Arbeiten auf Linux

Edit: finde ich die Ursache: Zeilenende. Sowohl Umsatz und Guid und andere hatten \ n anstelle von \ r \ n. Ich rettete sie mit \ r \ n statt und es funktionierte. Dennoch ist dies nicht geschehen soll ist es?

War es hilfreich?

Lösung

Es ist schwierig, ohne genau zu wissen, zu erraten, was in Conversion.cpp ist. Jedoch wird unter Verwendung von < mit Strom Positionen nicht durch den Standard definiert. Sie könnten eine explizite Umwandlung in dem richtigen Integer-Typ es vor der Formatierung prüfen wollen; Ich weiß nicht, was die Formatierung FATAL und format() erwarten durchzuführen oder, wie der % Operator ist überlastet. Stream-Positionen müssen nicht auf ganze Zahlen in eine predicatable Art und Weise abzubilden, schon gar nicht, wenn die Datei geöffnet wird, nicht im Binär-Modus.

Sie können eine alternative Implementierung für AtEof() zu betrachten. Sagen Sie so etwas wie:

bool AtEof()
{
    return mFile.peek() == ifstream::traits_type::eof();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top