Frage

ich zunächst einen Index-ähnlichen Mechanismus bauen, lesen Sie jede Zeile der Textdatei getline verwenden, zu überprüfen, ob es eine bekannte Kopfdeklaration (string.compare) übereinstimmt und das Speichern der tellg Position als Index zu diesem Punkt. Meine Absicht ist es dann zu verwenden seekg (Index, ios :: beg) an die Stelle in der Datei zu suchen, wo der Kopf ist. Nach der Lektüre über die Datei einmal, wenn meinen Index Aufbau und Aufruf seekg (0, ios :: beg) die nächste getline einen leeren String zurück, wo ich erwarte, dass die erste Zeile in der Datei zu sehen.

ein Teil meines Codes ist unten besser Highlight meiner Ausgabe

//build the index
while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead);
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

// start reading the file data
m_fileIn.seekg(0,ios::beg);
//read first line (title)

die getLineID Funktion gibt einen int in Abhängigkeit vom Ergebnis des String-Vergleichs.

ist die Verwendung von getline falsch, wenn ich wieder liest die Datei benötigen?

War es hilfreich?

Lösung

Ihr Problem verursacht, weil Sie ein Bad haben innerhalb der Strom-Bit gesetzt.
Operationen im Stream ignoriert werden, bis das Bad Bit zurückgesetzt wurde.

// After the loop reset the Bad Bits.
m_fileIn.clear()

Hinweis: Ein Bad Bit ist eine von vielen Fehlerbedingungen einschließlich EOF

Aber das ist nicht Ihre großen Probleme:

Sie haben die Classic anti pattern zum Lesen einer Datei:
Vielmehr diese verwenden.

while (getline (m_fileIn,lineRead))
{
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

Das Problem ist, dass die EOF nicht gesetzt ist, bis Sie vorbei lesen.
Die letzte gültige Lese liest UPTO aber nicht über die EOF (daher EOF nicht gesetzt).

die Situation also überlegen, wo Sie die letzte Zeile in der Datei gelesen haben. Der EOF nicht gesetzt worden ist, da Sie nicht daran vorbei gelesen haben. So wird die Schleife eingegeben. Sie führen jetzt getline (). Dieser versucht, hinter EOF zu lesen, da es absolut keine Daten (nicht ein einziges Byte) zu lesen. So getline () nicht jetzt rufen Sie getlineID () lineRead, deren Wert mit unbestimmt ist (der Standard nicht sagen, was passiert, wenn lineRead EOF-Bedingung getroffen wird, aber es hat wahrscheinlich der Wert der letzten Zeile lesen, wie Sie nicht scheinen zurücksetzen es innerhalb der Schleife).

Ein weiteres Problem mit diesem Code ist es nur prüft, ob EOF. Was passiert, wenn eine andere Art von Fehler auftritt? Die Schleife tatsächlich wird in einer Endlosschleife stecken; dies liegt daran, dass, wenn ein Fehler-Flag gesetzt ist nicht mehr das Lesen geschieht, so dass Sie nie an die EOF erreichen können.

while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead)
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

Die Lösung wird die Leseoperation in dem while-Schleife-Test durchzuführen. Dies funktioniert, weil getline () gibt den Stream als erster Parameter übergeben. Daher wird der Strom in einem Booleschen Kontext verwendet. Wenn ein Strom in einem Booleschen Kontext verwendet wird, wird es in einen Typ umgewandelt, die als eine Boolesche verwendet werden kann; der Wert dieses Objekts entspricht wahr, wenn es keine Fehler und falsch sind anders.

In dieser Situation ist die Lese versucht wird, aber wenn es die Schleife ausfällt nie eingegeben.

Andere Tipps

Nach dem Posting hier und Schleppen verschiedene Websites Ich habe die Zeile

m_fileIn.clear();

vor der Zeile

getline (m_fileIn,lineRead);

durch die Fehlerflags Clearing (Ich gehe davon aus EOF Fehler) konnte ich als normal fortzusetzen.

Martin -. Ich würde wirklich, um mehr über die anti-Muster interessiert sein, die ich unwissentlich benutzt, ich meinen Code aktualisiert haben, um die Änderungen, vielen Dank einschließen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top