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: 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; } |
|
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. getline |
|
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
|
|
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. |
|
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óż ... 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 |
|
« 1 » |