Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

getline ignoruje pierwszą zmienną string

Ostatnio zmodyfikowano 2020-12-16 17:17
Autor Wiadomość
patrol007
Temat założony przez niniejszego użytkownika
getline ignoruje pierwszą zmienną string
» 2020-12-15 20:28:34
Hej,
stworzyłem funkcję, która wczytuje dane z pliku tekstowego a następnie tworzy z nich strukturę.
Jednakże "getline" nie przypisuje pierwszej informacji do zmiennej jaką jest "temp.id_number" przez co w kompilatorze wyświetla pustą linie.
Wczytywanie pozostałych danych działa prawidłowo.
Wszystkie zmienne są typu string.
Próbowałem wszelkich sposobów i zapewne rozwiązanie jest banalne lecz nie mogę do niego dojść i proszę o wskazówki.

Przykładowa wczytywana linia:
6;Jacek;Przypadek;Sasiedzka 3/4;legitymacja studencka;wynajecie mieszkania

Po wyświetleniu struktury w miejscu gdzie powinno znaleźć się "6" pojawia się pusta linia.

Funkcja:
C/C++
person read()
{
   
person temp;
   
fstream file;
   
file.open( "visitors.txt", ios::in );
   
if( !file.is_open() ) cout << "Unexpected error during read of file\n";
   
   
else {
       
       
while( !file.eof() ) {
           
           
getline( file, temp.id_number, ';' );
           
getline( file, temp.name, ';' );
           
getline( file, temp.last_name, ';' );
           
getline( file, temp.address, ';' );
           
getline( file, temp.doc_info, ';' );
           
getline( file, temp.goal, '\n' );
           
       
}
    }
   
file.close();
   
return temp;
}
P-177842
DejaVu
» 2020-12-15 22:14:48
1. Sprawdź debuggerem co się dzieje po każdym wywołaniu getline
2. Upewnij się czy aby na pewno wypisujesz pole.

PS. jeżeli debuggera jeszcze nie opanowałeś to wypisz na ekranie to co wczytałeś po każdym getline.

» Język C++» standard C++» Wejście/Wyjście» basic_istreamgetline metoda

P-177844
patrol007
Temat założony przez niniejszego użytkownika
» 2020-12-16 10:51:34
Sprawdziłem debuggerem, okazało się że pętla while wykonuje się dwa razy.
Za pierwszym przejściem wszystkie dane wczytywane są poprawnie, za drugim jednak pomija pierwszy getline. W pamięci zapisuje poprostu "" i w takim stanie przechodzi do struktury.

Znalazłem informacje że ponoć .eof jest temu winny i przekazanie danych operatorem >> powinno pomóc. Jednakże nie wiem jak przekazać tak dane bo mam je podzielone średnikiem. Nie mogę dać białych znaków pomiędzy informacjami bo wtedy podzieli mi stringi :/

Wypisałem też na ekranie pierwsze 3 zmienne, i wyszło coś takiego:

6
Jacek
Przypadek

Jacek
Przypadek
        --VISITOR--
ID NUMBER:

Jacek Przypadek
Sasiedzka 3/4
Information about:
        Visitor's ID document: legitymacja studencka
        Visitor's goal: wynajecie mieszkania

Process returned 0 (0x0)   execution time : 0.250 s
P-177847
pekfos
» 2020-12-16 16:59:45
Najpierw wczytaj wszystkie dane tak jak masz teraz, potem sprawdź file.fail(). Jeśli wystąpił błąd to zakończ, w przeciwnym razie dodaj zapisz rekord gdzieś i kontynuuj wczytywanie.
P-177849
patrol007
Temat założony przez niniejszego użytkownika
» 2020-12-16 17:17:18
file.fail() nie wskazywał żadnego błędu, puszczał pętle dalej.
Dodałem zwykły brake na końcu pętli i działa jak powinno. Pewnie to dosyć chałupnicze ale cóż ...
C/C++
while( !file.eof() ) {
   
   
getline( file, temp.id_number, ';' );
   
getline( file, temp.name, ';' );
   
getline( file, temp.last_name, ';' );
   
getline( file, temp.address, ';' );
   
getline( file, temp.doc_info, ';' );
   
getline( file, temp.goal, '\n' );
   
break;
}

W każdym razie dzięki za podpowiedzi :D
P-177850
« 1 »
  Strona 1 z 1