Frage

Ich habe diese Funktion alle ints aus der Datei eingelesen. Das Problem ist, wenn ich Briefe lese ich eine neue Zeile auslösen und ich suche immer nach 1 und nicht bis zum Ende der Zeile. Wie kann ich diese Funktion besser schreiben?

int v;
    while (!in.eof())
    {
        while (in >> v)
            cout << v << " ";

        cout << endl;
        if (in.eof())
            break;
        in.clear();
        in.seekg(1, ios::cur);
        int a;
        a=0;
    }
War es hilfreich?

Lösung

Wenn Sie Ihre Datei von nur ints Leerzeichen (einschließlich) Zeilenumbrüche getrennt besteht dann sollte dies ausreichend sein.

while( in >> v )
{
    // do something with v
}

Nach der Datei, wenn in.fail () falsch ist und in.eof () wahr ist, dann erreicht man das Ende der Datei ohne einen Formatierungsfehler. Andernfalls wird ein Fehler aufgetreten einen int zu lesen.

Wenn Sie ungültige Eingaben erhalten und möchten Sie, dass dann wiederherstellen müssen, herauszufinden, wie Sie wiederherstellen möchten. Wenn Sie bis zum Ende der Zeile überspringen möchten und starten Sie wieder das Parsen, können Sie so etwas wie dieses verwenden.

in.clear();
in.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

Andere Tipps

Das erste Problem der obige Code ist noch nicht am Ende der Zeile.
Der Operator >> () ignoriert " Leerzeichen ", die die neuen Zeilen Zeichen enthalten.

Wie kann das besser geschrieben werden?
Das ist schwer zu sagen, ohne zu wissen, was Sie versuchen, mit den Zahlen zu tun und was das Eingabeformat der Datei ist!

Wenn ich aber diese wurden writting würde ich es schreiben, ohne diese Zeilen mit:

    if (in.eof())
            break;
    in.clear();
    in.seekg(1, ios::cur);

Wenn Sie eine formatierte Textdatei Verarbeitung ist es selten, die Verwendung von seek () zu sehen.

Assumign:
   Die Datei enthält nur Zahlen.
   Sie wollen alle Zahlen in einen Behälter lesen.

std::vector<int>    data;

std::copy(  std::istream_iterator<int>(in),  // An iterator from current point
            std::istream_iterator<int>(),    // To end of file.
            std::inserter(data)              // Destination (insert into data)
         );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top