2017-10-24 2 views
0

Ich versuche, die Gesamtzahl der Wörter in einer TXT-Datei zu messen. Die Datei ist zufällig und besteht aus Zeilen mit je 10 Wörtern der Länge 3 bis 10 und wird von dieser code generiert. Die Wörter in einer bestimmten Zeile sind durch ein einzelnes Leerzeichen getrennt. Nun wird die Art, wie ich die Gesamtzahl der Wörter in der Datei zu messen, ist dies:Unerwartetes Verhalten von ifstream (Wortzählung)

ifstream inputFile("myfile.txt", ios::in | ios::binary | ios::ate); 

//Count number of total words in input file 
long unsigned int numWords; 
inputFile.seekg(0); 
char c; 
while (inputFile.get(c)){ 
    if (isspace(c) && c != '\r') numWords++; 
} 

//Test 
printf("\nSampled file has %lu words\n", numWords); 

Wenn ich die oben genannten Code mehrmals ausgeführt, die Hälfte von ihnen wird das richtige Ergebnis und die Hälfte von ihnen einige Zufallszahl. Ich weiß, dass es elegantere Wege, dies zu tun, wie

string word; 
long unsigned int ctr = 0; 
while (inputFile >> word) ctr++; 

(oder vielleicht andere), aber ich würde gerne wissen, warum die erste Option nicht.

+1

Haben Sie '' n''-Zeichen auch berücksichtigt? – alseether

+2

Warum initialisierst du 'numWords' nicht mit Null? – DAle

+0

Wenn das das ganze Programm ist, das Sie verwenden, kann es sein, dass 'numWords' nicht mit 0 initialisiert wird. –

Antwort

2

Es gibt mehrere Probleme mit Ihnen Code

  1. Sie öffnen Datei in Binär-Modus, die Ihr Programm plattformabhängig macht. Die Linie könnte durch '\r', '\n' oder "\r\n" getrennt sein. Wenn Sie im Textmodus öffnen, werden Zeilen garantiert mit '\n' getrennt.
  2. Was ist der Punkt der Datei mit ios::ate Flag öffnen und sofort seekg(0) aufrufen? Es funktioniert, aber Bith ios::ate und seekg weglassen hat den gleichen Effekt und weniger Code zum Schreiben und Lesen.
  3. Sie zählen Leerzeichen (außer '\r'), keine Wörter. Einschließlich doppelte Leerzeichen, '\n' Zeichen am Ende der Zeile und ähnlich.
  4. Und die wahrscheinlichste Ursache - nicht initialisierte Variable numWords. Wenn Sie es verwenden, wird ein nicht definiertes Verhalten aufgerufen. In Ihrem Fall sind zufällige Ergebnisse der wahrscheinlichste Effekt.