Frage zu Verhalten von getline in Kombination mit tellg und seekg
-
Hallo,
ich habe folgende Textdatei:
aaaa bbbb cccc 12345678 dddd eeeeJetzt wird folgendes ausgeführt:
std::ifstream m_file; m_file.open("test.txt"); std::string line; std::getline(m_file, line); std::getline(m_file, line); std::getline(m_file, line);die ersten 3 Zeilen werden also ausgelesen. Jetzt würde ich gerne eine Zeile weiter prüfen, was dort steht, und anschließend aber evtl. doch wieder von der aktuellen Position an fortfahren:
int pos = m_file.tellg(); // Merke dir die aktuelle Position std::getline(m_file, line); // Naechste Zeile lesen und ausgeben cout<< "lookahead: "<<line<<endl; m_file.seekg(pos); // Zeiger wieder zuruecksetzenIch wuerde jetzt erwarten, dass ich nach erneutem std::getline die Zeile "12345678" erhalte.
Das Verhalten ist aber merkwürdig. tellg() sagt mir nicht wie erwartet "Byte 13", sondern bereits bevor Zeile 4 gelesen wurde "Byte 20".
Dann erst lese ich Zeile 4 und setze anschließend die Position auf "Byte 20", erhalte nach dem lesen aber "345678"
.Verwende ich die Funktionen falsch? Wenn ich von der Position die Länge (Anzahl Bytes) der vorherigen Line abziehe, den Zeiger also gefühlt auf den Anfang von Zeile 4 setze, liefert der nächste std::getline-Aufruf nach:
m_file.seekg(pos-4);nichts zurück
Ich raff das gerade nicht

-
Ich hab per google diesen Thread gefunden:
http://www.c-plusplus.net/forum/101283
Ich verstehe das aber weiterhin nicht:
std::ifstream m_file; m_file.open("test.txt"); std::string line; std::getline(m_file, line); std::getline(m_file, line); std::getline(m_file, line); std::streampos pos = m_file.tellg(); cout << line << endl; cout << pos << endl; // Eine Reihe lookahead cout << "--------------------------" << endl; std::getline(m_file, line); cout << "lookahead: " << line << endl; m_file.seekg(pos, std::ios::beg); cout << m_file.tellg() << endl; // Erwarte 12345678, erhalte aber 345678 std::getline(m_file, line); cout << "danach : " << line << endl; return 0;Der Zeiger steht nach tellg genau da, wo er vorher war, aber beim auslesen fehlen Zeichen

-
Okay, mit google folgendes gefunden:
http://www.c-plusplus.net/forum/252092
Man muss die Datei im Binärmodus öffnen, dann geht es auch:
m_file.open("test.txt", ios::binary);Danke für's Lesen meiner Posts
