Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » getline liest eine Zeile zuviel

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
31.01.2011, 14:23 Uhr
~xyz__7000
Gast


Hallo zusammen,
also ich möchte eine Textdatei zeilenweise auslesen, sodass jede Zeile in einem String gespeichert werden soll. Die Textdatei sieht in etwa so aus:


Code:
Name1;Handynummer1;Adresse1
Name2;Handynummer2;Adresse2
...


Dafür habe ich folgendes Programm geschrieben:

C++:
void dateileser(char* ort){
    string einstring;
    ifstream eingabestream;                
    eingabestream.open(ort, ios::in);      
    if(eingabestream){
        while(!eingabestream.eof()){
            getline(eingabestream, einstring);
            cout << "getline: \"" << einstring << "\"" << endl;   // Zum Testen
        }
    }
    else{
        cout << "Datei nicht gefunden!" << endl;
    }
    eingabestream.close();
    eingabestream.clear();
}

Leider gibt das Programm ein String zuviel und sieht dann die Ausgabe folgendermaßen aus:

Code:
"Name1;Handynummer1;Adresse1"
"Name2;Handynummer2;Adresse2"
[color="#FF0000"]""[/color]

Anfangs dachte ich, dass es sich um ein "\n" oder "\0" handelt. Deshalbe habe ich noch eine if-Anweisung hinzugefügt..

C++:
if(einstring != "\n")
cout << "getline: \"" << einstring << "\"" << endl;

.. hat aber nicht geholfen.

Wie kann ich verhindern, dass ich ein überflüssiges String bekomme?
Config: Netbeans + Ubuntu

Vielen Dank im Voraus
MfG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.01.2011, 14:39 Uhr
TOSHMAX



Es liegt vermutlich trotzdem daran, dass eine leere Zeile zuviel in der Datei liegt. Entweder du entfernst sie, oder du versuchst mal statt mit "\n" auch mit "\r" und "\r\n" zu vergleichen. In einigen Editoren kann man einstellen welche Art von "Newline" verwendet wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.01.2011, 15:07 Uhr
~xyz__7000
Gast


Hallo TOSHMAX,
Nein die Datei hat keine leere Zeile am Ende. Leider hat das mit "\r" und "\r\n" nicht geholfen.
Danke für die Hilfe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.01.2011, 15:21 Uhr
~xyz__7000
Gast



Ich das Problem behoben indem ich die eof nochmal vor cout geprüft habe. Also einfach

C++:
if(!eingabestream.eof())
cout << "getline: \"" << einstring << "\"" << endl;

Also es läuft auch wenn ich ein bissel unlogisch finde ::
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.01.2011, 15:28 Uhr
ao

(Operator)


Überhaupt nicht unlogisch. Durch das Einlesen der letzten Zeile ist eof () wahr geworden, was es vorher nicht war.

Dein Programm ist jetzt aber falsch, weil es annimmt, dass nach den ganzen Name-Handy-Adresse-Zeilen noch eine Zeile folgen muss, die etwas anderes enthält. Was ist, wenn das mal nicht der Fall ist? Dann verlierst du den letzten Datensatz.

Abhilfe: Du musst alle Zeilen lesen und analysieren und diejenigen verarbeiten, die das richtige Format haben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.01.2011, 15:56 Uhr
~xyz__7000
Gast


Hallo ao,
wie schon oben erwähnt es gibt keine leere Zeile am Ende der Datei.Ich finde unlogisch, dass die While-Schleife einen Lauf macht, obwohl es keine Zeilen mehr gibt. Oder vielleicht bin ich zu doof um den Verlauf verstehen zu können..
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.01.2011, 16:01 Uhr
ao

(Operator)


Ach so. Ich hatte verstanden, das hier:

[color="#FF0000"]""[/color]

wäre der letzte Dateiinhalt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.01.2011, 16:34 Uhr
Tommix



Trotzdem richtig, würde ich sagen:
https://ssl.secure-hosts.de/www.fun-soft.de/showtopic.php?threadid=20219
(Post 2 von 0xdeadbeef).

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
31.01.2011, 16:44 Uhr
~xyz__7000
Gast


Danke Tommix! Jetzt ist mir alles klar geworden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: