• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

c++ End of File

Hallo,

ich moechte per c++ ein Textfile auslesen, leider liest mein Programm immer am Ende eine Zeile zuviel (nein keine Leerzeile die ich uebersehen habe). Ich habe folgendes gemacht:

#include <iostream>
#include <fstream>
#include <string>


using namespace std;



int main (int argc, char* argv[]) {

ifstream input_file(argv[1]);
int i=0;
string input_line;

while (!input_file.eof()){
cout << i;
input_line.clear();
getline(input_file,input_line);
cout << input_line << " \n";
i++;
}

input_file.close();


return 0;
}

Als Parameter irgendein Textfile mitgeben und vor jede Zeile wird die Zeilennr. gestellt. Am Ende ist aber immer eine Zeile zuviel. Wieso springt er einmal zu viel in die while Schleife?

Danke und Gruss, J.
 

spoensche

Moderator
Teammitglied
wenn ich dich jetzt richtig verstanden habe, könnte daran liegen,dass du nach jeder zeile die du ausgibst eine neue zeile beginnst.sobald aber die letzte zeile in deiner datei erreicht ist,beginnst du wieder eine neue zeile (siehe "\n"). Tipp: if abfrage ob i = 0 ist, dann ...
 
Hallo Jochen,

das liegt an der Reihenfolge der Befehle. Ich würde die erste Zeile der Datei vor der Schleife lesen und das getline innerhalb der Schleife ganz ans Ende setzen. Ungefähr so:

Code:
getline(input_file,input_line);
while (!input_file.eof()){
   cout << i;
   cout << input_line << " \n";
   input_line.clear();
   getline(input_file,input_line);
   i++;
}

So stellst Du sicher, dass nach dem Erreichen des Dateiendes keine Ausgabe mehr erfolgt. Ich bin kein C++-Progger, aber ich vermute, dass Du beim ersten getline auch das Dateiende abfangen musst (leere Datei).
Eleganter wäre natürlich, wenn getline einen Boolschen Rückgabewert hätte, so dass man das Zeilenlesen gleich als Abbruchbedingung verwenden kann. Sowas wie

Code:
while (getline(input_file,input_line)){
   cout << i;
   cout << input_line << " \n";
   input_line.clear();
   i++;
}

geht in C++ nicht?

Viel Erfolg!
 
Oben