web-dev-qa-db-de.com

Wie kann man feststellen, ob der nächste Buchstabe ist? EOF in C++

Ich muss wissen, ob das nächste Zeichen in ifstream das Ende der Datei ist. Ich versuche das mit .peek():

if (file.peek() == -1)

und

if (file.peek() == file.eof())

Aber keiner funktioniert. Es gibt eine Möglichkeit, dies zu tun?

Edit: Was ich versuche, ist, einen Buchstaben am Ende jedes Words in einer Datei anzufügen. Dazu frage ich, ob das nächste Zeichen ein Interpunktionszeichen ist. Auf diese Weise bleibt das letzte Wort ohne einen zusätzlichen Buchstaben. Ich arbeite nur mit char, nicht mit string.

10
Tae

istream::peek() gibt die Konstante EOF (welche nicht garantiert gleich -1 ist) zurück, wenn das Dateiende oder error erkannt wird. So prüfen Sie zuverlässig das Dateiende:

int c = file.peek();
if (c == EOF) {
  if (file.eof())
    // end of file
  else
    // error
} else {
  // do something with 'c'
}

Sie sollten wissen, dass das zugrunde liegende OS-Grundelement read(2) nur dann EOF signalisiert, wenn Sie versuchen, past am Ende der Datei zu lesen. Daher ist file.eof() nicht wahr, wenn Sie lediglich bis das letzte Zeichen in der Datei gelesen haben. Anders ausgedrückt bedeutet file.eof(), dass der nächste Lesevorgang erfolgreich ist.

22
zwol

Das sollte funktionieren:

if (file.peek(), file.eof())

Warum aber nicht einfach nach Fehlern suchen, nachdem Sie versucht haben, nützliche Daten zu lesen?

8
Ben Voigt

Für einen mit der Tastatur verbundenen Stream ist die Bedingung, dass ich bei der nächsten Eingabe Strg + D/Strg + Z eingeben möchte.

peek() kann das überhaupt nicht sehen. :-)

2
Bo Persson

file.eof() gibt einen Flag-Wert zurück. Sie ist auf TRUE gesetzt, wenn Sie nicht mehr aus der Datei lesen können. EOF ist kein tatsächliches Zeichen, sondern eine Markierung für das Betriebssystem. Wenn Sie also dort sind, sollte file.eof()true sein.

Anstelle von if (file.peek() == file.eof()) sollten Sie if (true == file.eof()) nach einem Lesevorgang (oder nach einem Blick) haben, um zu überprüfen, ob Sie das Ende der Datei erreicht haben (was Sie versuchen, wenn ich es richtig verstanden habe).

1
littleadv

Es gibt keine Möglichkeit zu sagen, ob das nächste Zeichen das Ende der Datei ist, und dies ist einer der häufigsten Fehler, den neue C- und C++ - Programmierer ausführen, da in den meisten Betriebssystemen kein Dateiende-Zeichen vorhanden ist . Was Sie feststellen können, ist, dass das Lesen der aktuellen Position in einem Stream am Ende der Datei vorbeigeht. Dies ist jedoch im Allgemeinen eine ziemlich sinnlose Information. Sie sollten stattdessen alle Lesevorgänge auf Erfolg oder Misserfolg testen und auf diesen Status reagieren.

1

Sie haben keinen Code gezeigt, mit dem Sie arbeiten, daher gibt es einige Vermutungen von meiner Seite. Normalerweise benötigen Sie beim Arbeiten mit Streams keine Low-Level-Funktionen (wie peek()). Was Sie wahrscheinlich interessiert, ist istream_iterator. Hier ist ein Beispiel,

  cout << "enter value";

  for(istream_iterator<double> it(cin), end; 
      it != end; ++it)
  {
     cout << "\nyou entered value " << *it;
     cout << "\nTry again ...";
  }

Sie können istreambuf_iterator auch verwenden, um direkt mit dem Puffer zu arbeiten:

  cout << "Please, enter your name: ";

  string name;
  for(istreambuf_iterator<char> it(cin.rdbuf()), end;
    it != end && *it != '\n'; ++it)
  {
    name += *it;
  }
  cout << "\nyour name is " << name;
0
Gene Bushuyev

Normalerweise prüfe ich das Dateiende:

    if(cin.fail())
    {
        // Do whatever here
    }

Ein anderer Weg, dies zu implementieren, wäre ..

    while(!cin.fail())
    {
        // Do whatever here
    }

Zusätzliche Informationen sind hilfreich, damit wir wissen, was Sie tun möchten.

0
tf.rz