2010-11-22 4 views
0

Ich habe Probleme mit dem folgenden Code. Was ich erwarte ist, dass die do-while Schleife 4 Mal ausgeführt wird, einmal für jede Zeile der Textdatei, in der sie eingelesen wird, aber in Wirklichkeit führt sie fünf Mal aus, was später zu einem Segmentfehler im Programm führt. Was mache ich hier falsch, was dazu führt, dass es die zusätzliche Iteration ausführt? Ich habe versucht, er do-while mit einer einfachen while Schleife zu ersetzen, aber das Ergebnis ist das gleiche.Diese Schleife führt mehr Iterationen als erwartet aus

int count = 0; 
string devices[4]; 
string line; 
ifstream DeviceList; 
DeviceList.open("devices/device_list.txt"); 
do 
{ 
getline(DeviceList, line); 
devices[count] = line; 
count ++; 
} while(!DeviceList.eof()); 

device_list.txt enthält folgende Komponenten:

WirelessAdaptor 
GPU 
CPU 
Display 
+1

Sind Sie sicher, dass am Ende Ihrer Eingabedatei keine Leerzeichen (insbesondere Leerzeilen) stehen? Verwenden Sie einen Debugger (oder nur "cout"), um den Wert von "line" in jedem Schritt zu untersuchen. – suszterpatt

+0

Beendet die 4. Zeile Ihrer .txt-Datei ("Display") mit einem Carriage Return/Newline? Wenn ja, haben Sie wirklich eine zusätzliche (leere) Zeile. – cbranch

Antwort

1

eof() nicht true zurück zu ignorieren, bis getline das Ende verbraucht. Es tut dies nicht, bis die getline Anruf nach die letzte Zeile lesen. Sie müssen überprüfen, ob eof wahr ist sofort nach getline Anruf:

while(true) 
{ 
    getline(DeviceList, line); 
    if(DeviceList.eof()) 
    break; 
} 
+1

Freds Version ist besser und mehr als nur eof. –

+0

Einverstanden. Die Überprüfung von 'eof' ist sinnvoller, wenn das Erreichen des Dateiendes spezifisch ist. Vielleicht möchten Sie eine Ausnahme bei einem Fehler auslösen, aber zum Beispiel mit eof fortfahren. –

+0

@Noah: Es hat jedoch nicht für leere Zeilen berücksichtigt, bis meine Bearbeitung. –

1

eof() nicht wahr zurück, bis Sie versuchen, mehr Daten zu lesen, als es gelassen wird.

0

Oberhalb der Linie getline(DeviceList, line); einfügen cout << line.length() << endl; und sagen Sie uns, was passiert.

5

Ich denke, Ihre Schleife wahrscheinlich mehr soll wie folgt aussehen:

Edit: Hinzugefügt Scheck Leerzeilen

while (getline(DeviceList, line)) 
{ 
    if (line.length() > 0) 
    { 
     devices[count] = line; 
     ++count; 
    } 
} 
0

Ihre Textdatei wahrscheinlich einen Zeilenvorschub nach der letzten Zeile enthält, so getline liest eine leere Zeichenfolge, bevor die Schleife tatsächlich endet.

Verwandte Themen