fstream.getline nie odczytuje z pliku

0

Witam! W mojej pseudo bazie danych dorobiłem odczytywanie wpisu. Getline działa tylko 2 razy potem już nie odczytuje, lecz widzę tu coś dziwnego. Przedstawiam kod, po zapoznaniu się z nim proszę czytać dalej :P

class ENTRY
{
    public:
        char ID[256];
        char name_surname[256];
        char sex;
        char address[256];
        int age;
        char phone[256];
};

ENTRY temp;

int Read()
{
    char path[256];
    fstream plik;
    
    system("CLS");
    strcpy(path, "Data\\");
    strcat(path, temp.ID);
    strcat(path, ".emdb");
    plik.open(path, ios::in);
    plik.getline(temp.name_surname, sizeof(temp.name_surname));
    plik >> temp.sex;
    plik.getline(temp.address, sizeof(temp.address));
    plik >> temp.age;
    plik.getline(temp.phone, sizeof(temp.phone));
    if (temp.name_surname == "" || temp.sex == 0 || temp.address == "" || temp.phone == "") return 1;
    else
    {
        system("CLS");
        cout << "Odczyt wartosci dla wpisu o ID = " << temp.ID << endl;
        cout << "-----------------------------------" << endl;
        cout << temp.name_surname << endl;
        cout << "Plec: " << temp.sex << endl;
        cout << "Adres: " << temp.address << endl;
        cout << "Wiek: " << temp.age << endl;
        cout << "Tel.: " << temp.phone << endl << endl;
        system("PAUSE");
        return 0;
    }
}

No i tak, w funkcji Read jeżeli nie odczyta z pliku np. temp.name_surname czy adresu (temp.address) to funkcja zwraca 1 (błąd). No właśnie, czyta mi tylko pierwsze 2: temp.name_surname i płeć, potem pola są puste, a temp.age = 0. Skoro dałem if'a sprawdzającego czy czegoś nie odczytał to czemu idzie wykonywanie else'a? No i dlaczego nie odczytuje tej reszty danych? Proszę o pomoc.
PS: ID wpisu jest podawane w oddzielnej funkcji, ale myślę, że to chyba nie ma znaczenia. (ID to nazwa pliku bez rozszerzenia, a z path czytam plik)

0

TRAGEDIA. Kto cię takich beznadziejnych nawyków nauczył?

  1. Zamiast char[] używaj std::string
  2. Jak używasz char[] to naucz się że NIE PORÓWNUJE się takich napisów za pomocą == tylko strcmp()
  3. Zasadniczo mieszanie wczytywania getline() i wczytywania operatorem >> to zła praktyka bo potem jest płacz ze "program pomija dane" jak ktoś nie wie która funkcja połyka białe znaki a która nie.
0
  1. Zamiast char[] używaj std::string

w tym przypadku nie zgodzę się, jako że jest to rekord zapisywany do pliku, który na dodatek musi mieć zdeterminowany rozmiar. gdyby użyć stringa, co byś zapisywał – wskaźnik?

1

Ok, można używać char[], ale trzeba to robić z głową. Jak ktoś robi

temp.name_surname == ""

to powinien sie zastanowić czy chce korzystać ze stringa czy z char[]
Poza tym na moje oko ten kod to jest taki potworek:
"nie umiem pisać w C++ ale nie umiem wczytywać w C całej linii z pliku, więc wezme kod w C, zamienie class na struct i użyje getline()"

0

Shalom piłeś coś? :D To ostatnie zdanko coś dziwne Ci wyszło... a poza tym to nie prawda ;> Kurde, nie zawsze początkujący od razu umie wszystko, a pisać chce. Czyli jak mam wczytać z pliku wszystkie dane getline'em? Wiem, że cin to pierw trzeba cin.ignore jeżeli przed getline'em używało się cin >>. Z fstream'em to nie działa :) więc jak to zrobić? Użycie getline'a wszędzie kończyło się tym samym błędem.

0

w istream masz .get() też, a wczytywanie do końca strumienia/pliku, to banał:

string line, all; 
while(getline(istream, line)) { all += line + '\n'; }

Poczytaj dokumentację: http://www.cplusplus.com/reference/iostream/istream/

0

Jakim błędem? Że tylko dwa razy wczytywało, a potem nie chciało?

0

Tak, o taki błąd chodziło, lecz już wszystko rozwiązałem. Po prostu dałem wszystko w char[] i działa jak powinno. (A pewnie ten "błąd" to nie błąd tylko tak kazałem dzialać aplikacji, tak wiem wiem ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1