Mögliche Gründe für tellg () versagt?
-
22-09-2019 - |
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?
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();
}