2016-10-03 3 views
-1

Hier ist der Code. Es gibt den GENAUEN Ausgang wie unten gezeigt bedeutet, dass er die Datei liest. Aber es zeigt auch fails, wie Sie sehen können, bedeutet fin.fails() ist true. Ich möchte wissen, warum dies wahr ist, obwohl ich die Datei erfolgreich lesen kann.Warum Input-Stream-Objekt fehlschlägt nach dem Lesen der Datei bis zum Ende?

#include<fstream> 
#include<iostream> 
using namespace std; 
int main() 
{ ifstream fin; 
    fin.open("pro.txt"); 
    char ch; 
    int data; 
    while(!fin.eof())//!(fin >> ch).eof() 
    { 
     fin.get(ch); 
     cout<<ch; 
     if(fin.fail()) { 
      cout<<"fails"; 
     break; 
     } 
    } 
    fin.clear(); 
    fin.seekg(0); 
    int pos=(int)fin.tellg(); 
    cout<<"\n this is :"<<pos; 
    fin.close(); 
    return 0; 
} 

Output is : 
this is my name 
fails 
this is 0 

Contents of pro.txt: 
this is my name 

Ich weiß nicht, warum das passiert!

+1

[OT] Verwenden Sie 'eof' nicht für eine Schleifenbedingung: http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-conspired-wrong – NathanOliver

+0

dann was zu benutzen ? und auch warum die fin.fails wahr ist – akitsme

+0

Der richtige Weg ist die Leseoperation zu verwenden. – NathanOliver

Antwort

0

noch nicht finden können, warum die fin.fails() wahr ist, weil ich niemand bereit zu denken aber dachte ich ohne weiße Räume und Datei auszulesen fin.fails() = true zu machen. ersetzen Sie einfach die while(!fin.eof()) durch while(fin.get(ch)) und entfernen Sie die fin.get(ch) Gegenwart in Körper -> das war der Grund, warum meine Ausgabe übersprang ein Zeichen für jeden gelesen .. Dies hatte ich in den Kommentaren erwähnt.

+0

Ja, ich erwähnte das auch in Kommentaren, aber Sie haben mir gesagt, dass ich falsch lag. : smh: –

+0

ich habe das nicht gesagt! Ich weiß, das war meine Schuld und 'fin >> ch 'schafft es nicht weiße Räume versuchen Sie es selbst – akitsme

+0

Dies ist das erste Mal, dass Sie Leerzeichen erwähnt haben .... –

0

Das Problem ist folgendes: das letzte Zeichen in der Datei Lesung mit get wird nicht die eofbit gesetzt, so dass der Anruf an fin.eof() in Ihrem while Zustand zurückkehrt noch false, nachdem Sie das letzte Zeichen der Datei in der Lese Schleifenkörper. Dann versuchen Sie während der Iteration nach dem Lesen des letzten Zeichens ein anderes Zeichen innerhalb des Schleifenkörpers zu lesen, auch wenn kein Zeichen mehr zu lesen ist. Dies setzt die eofbitund die failbit gemäß specification von get.

TL; DR: Lesen über das Ende einer Datei soll die setzen.

Verwandte Themen