[C++] Wczytywanie z pliku

KillerQueen_
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 19 lut 2011, o 21:23
Płeć: Kobieta
Lokalizacja: Biegun Północny

[C++] Wczytywanie z pliku

Post autor: KillerQueen_ »

Witam!
Mam do napisania program obsługujący bazę danych osób. Generalnie mam już prawie wszystko, ale jest pewien szkopuł, który wszystko psuje.
Dane w pliku mają postać: #Imię(imiona) Nazwisko(nazwisko złożone) urodziny:data imieniny:data, przy czym jest kilka formatów daty: dd.mm.rrrr, rrrr-mm-dd, mm/dd/rrrr.

Wczytuję dane w ten sposób:

Kod: Zaznacz cały

plik >> L.imie >> L.nazwisko >> L.urodziny >> data1 >> znak1 >> data2 >> znak2 >> data3 >> L.imieniny >> data4 >> znak3 >> data5;
imię, nazwisko, słowo kluczowe urodziny, potem data i znaki rozdzielające poszczególne składowe daty, słowo kluczowe imieniny i data imienin; Problem pojawia się wtedy, kiedy ktoś ma 2 imiona, wtedy program wariuje, a ja nie mam pomysłu jak wczytać te dane inaczej. Getline() nie może być, bo potem nie ma jak tego modyfikować.
Stąd moje pytanie: jak zrobić, żeby program rozpoznawał, że to już nazwisko albo jeszcze drugie imię? Albo po błędnym wczytaniu wiersza wracał na koniec poprzedniego i już w inny sposób wczytywał ten wiersz?

Z góry dziękuję!
Jacek_Karwatka
Użytkownik
Użytkownik
Posty: 351
Rejestracja: 2 maja 2012, o 16:16
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 1 raz
Pomógł: 94 razy

[C++] Wczytywanie z pliku

Post autor: Jacek_Karwatka »

Z tego co rozumiem poszczególne rozdaje danych są oddzielone słowami kluczowymi.
Jeśli nie pojawi się słowo kluczowe "Nazwisko" wczytywane dane należny traktować jako kolejne imiona.

Bez słowa kluczowego (separatora) nie zawsze można stwierdzić gdzie kończy się imię a zaczyna nazwisko. Mój znajomy ma na nazwisko "Wacek". Czy linia:
Marian Wacek Olszewski
oznacza gościa o podwójnym imieniu, czy podwójnym nazwisku?
Można np. przyjąć że nazwisko jest jedno, a jeśli jest złożone to jest łączone myślnikiem.
Ale to dodatkowa reguła.

Wczytanie linii przez Getline() to dobry pomysł. Zawsze można zrobić kopię i to już można modyfikować, dzielić na tokeny itp. Kluczowe jest uściślenie reguł czytania danych tak aby zapis "Marian Wacek Olszewski " miał jednoznaczną interpretacje.
KillerQueen_
Użytkownik
Użytkownik
Posty: 97
Rejestracja: 19 lut 2011, o 21:23
Płeć: Kobieta
Lokalizacja: Biegun Północny

[C++] Wczytywanie z pliku

Post autor: KillerQueen_ »

Z innej strony podeszłam do tego problemu, tzn. wczytuję za pomocą getline() i wtedy dla szukania daty urodzin operuję na tablicy stringów.
Wszystko działa, ale tylko dla 1 rekordu, tzn. nie czyści mi na koniec strumienia stringstream:

Kod: Zaznacz cały

  stringstream konwersja(dzien);
    konwersja>>dzien1;
    cout<<dzien1<<endl; 

Dla 1 osoby wyświetli dobrze, dla drugiej już wypisuje najpierw dane 1 osoby, a potem drugiej, próbowałam już wielu opcji: clear, str, seekg, nie czyści cholerstwa.

Edit:
Znalazłam błąd. Okazało się, że to wszystko czyści strumień, zapomniałam jednak o wyczyszczeniu zwykłych stringów - dzien, miesiac, rok
ODPOWIEDZ