Nieprawidłowe wczytanie pliku txt do konsoli (fstream)

0

Witam wszystkich, mam problem z powrotnym wczytaniem pliku w konsoli mianowicie chciałem zrobić taką małą bazę danych ( korzystając z kursu na udemy c++ ) podczas dodawania osoby i wczytywaniem jej nie ma problemu również gdy zapisujemy ją w pliku. Problem tworzy się gdy zamykam konsole i włączam na nowo podczas wyboru wczytania danych z pliku.txt nie jest wyświetlana poprawnie lista osób dodanych do listy.

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <fstream>
using namespace std;



struct pracownik
{
	string imie;
	string nazwisko;
	short wiek;
	float stawka;
	short godziny;
	float wynagrodzenie;
};

short ileDodanoOsob;
pracownik pracownicy[100];


void enter();
void dodajOsobe();
void pokazOsoby();
void zapiszOsobyDoPliku();
void wczytajOsobyZPliku();
int main()
{
    char tescior;
    do
    {
        cout << "Menu" << endl;
        cout << "Osob w bazie: " << ileDodanoOsob <<endl;
        cout << "1.Dodaj osobe" << endl;
        cout << "2.Pokaz osoby dodane" << endl;
        cout << "3.Zapisz osoby do pliku" << endl;
        cout << "4.Wczytaj osoby z pliku" << endl;

        tescior = getch();
        switch(tescior)
        {
            case '1':
                dodajOsobe();
                break;
            case '2':
                pokazOsoby();
                break;
            case '3':
                zapiszOsobyDoPliku();
                break;
            case '4':
                wczytajOsobyZPliku();
                break;
        }

        enter();
        system("cls");
    }while(tescior != 27);


    return 0;
}

void enter()
{
    cout << "Nacisnij enter aby kontynuowac";
    while(getch() != 13);
}

void dodajOsobe()
{
		cout << "Podaj imie: ";
		cin >> pracownicy[ileDodanoOsob].imie;
		cout << "Podaj nazwisko: ";
		cin >> pracownicy[ileDodanoOsob].nazwisko;
		cout << "Podaj wiek: ";
		cin >> pracownicy[ileDodanoOsob].wiek;
		cout << "Podaj stawke: ";
		cin >> pracownicy[ileDodanoOsob].stawka;
		cout << "Podaj przepracowana liczbe godzin: ";
		cin >> pracownicy[ileDodanoOsob].godziny;
		pracownicy[ileDodanoOsob].wynagrodzenie = pracownicy[ileDodanoOsob].stawka*pracownicy[ileDodanoOsob].godziny;

		ileDodanoOsob ++;
}

void pokazOsoby()
{
    if (ileDodanoOsob > 0)
    {
        for (int j = 0; j < ileDodanoOsob; j++)
        {
            cout << "Osoba nr: " << (j+1) << endl;
            cout <<"Imie: " << pracownicy[j].imie <<endl;
            cout <<"Nazwisko: " << pracownicy[j].nazwisko <<endl;
            cout <<"Wiek: " << pracownicy[j].wiek <<endl;
            cout <<"Stawka: " << pracownicy[j].stawka <<endl;
            cout << "Przepracowane godziny: " << pracownicy[j].godziny << endl;
            cout <<"Wynagrodzenie: " << pracownicy[j].wynagrodzenie <<endl;
            pracownicy[j].wynagrodzenie = pracownicy[j].stawka*pracownicy[j].godziny;
        }
    }
    else
        cout << "Baza jest pusta" << endl;
}

void zapiszOsobyDoPliku()
{
    fstream  file("baza.txt", ios::out);

    if(file.is_open())
    {
        file << ileDodanoOsob << endl;
        for(int j=0; j < ileDodanoOsob; j++)
        {
            file <<"Imie: " << pracownicy[j].imie <<endl;
            file <<"Nazwisko: " << pracownicy[j].nazwisko <<endl;
            file <<"Wiek: " << pracownicy[j].wiek <<endl;
            file <<"Stawka: " << pracownicy[j].stawka <<endl;
            file << "Godziny: " << pracownicy[j].godziny << endl;
            file <<"Wynagrodzenie: " << pracownicy[j].wynagrodzenie <<endl;
            
            pracownicy[j].wynagrodzenie = pracownicy[j].stawka*pracownicy[j].godziny;
        }
        file.close();
    }
    else
        cout << "Plik nie zostal otwarty poprawnie" << endl;


}

void wczytajOsobyZPliku()
{
    fstream file("baza.txt", ios::in);

    if (file.is_open())
    {
       file >> ileDodanoOsob;

       for (int j = 0; j < ileDodanoOsob; j++)
       {
           file >> pracownicy[j].imie;
           file >> pracownicy[j].nazwisko;
           file >> pracownicy[j].wiek;
           file >> pracownicy[j].stawka;
           file >> pracownicy[j].godziny;
           file >> pracownicy[j].wynagrodzenie;

           pracownicy[j].wynagrodzenie = pracownicy[j].stawka*pracownicy[j].godziny;

       }

        /*int i = 0;
       do
       {
            file >> pracownicy[i].imie;
            file >> pracownicy[i].nazwisko;
            file >> pracownicy[i].wiek;
            file >> pracownicy[i].stawka;
            file >> pracownicy[i].wynagrodzenie;
            i++;
       }while(!file.eof()); */

       file.close();
    }
    else
        cout << "Nie udalo sie odtworzyc pliku" << endl;

}
0
Wolson napisał(a):

nie jest wyświetlana poprawnie lista osób dodanych do listy.

Co znaczy "nie jest poprawnie wyświetlana"?

1
  1. Gdzie inicjujesz zmienną ileDodanoOsob?

  2. Zapisujesz w ten sposób:

file <<"Imie: " << pracownicy[j].imie <<endl;

a odczytujesz w ten:

file >> pracownicy[j].imie;
  1. Aktualizuj wartość pracownicy[].wynagrodzenie tylko gdy w bazie coś się zmieni.
0
tajny_agent napisał(a):
Wolson napisał(a):

nie jest wyświetlana poprawnie lista osób dodanych do listy.

Co znaczy "nie jest poprawnie wyświetlana"?

znaczy że nie wczytuje poprawnie danych które zostały zapisane w pliku .txt np. wpisuje imie Jan nazwisko kowalski - zapisuje do pliku i zamykam konsole. Na nowo otwieram konsole i wczytuje dane z pliku po czym chce aby mi wyświetliło osoby wpisane i niestety jest tylko imię: imię: nazwisko: ( dokładnie 2x imię bez żadnych danych )

Delor napisał(a):
  1. Gdzie inicjujesz zmienną ileDodanoOsob?

  2. Zapisujesz w ten sposób:

file <<"Imie: " << pracownicy[j].imie <<endl;

a odczytujesz w ten:

file >> pracownicy[j].imie;
  1. Aktualizuj wartość pracownicy[].wynagrodzenie tylko gdy w bazie coś się zmieni.

Inicjuje zaraz pod struct. Czy w zapisywaniu i odczytywaniu popełniam błąd bo nie rozumiem ?

1
Delor napisał(a):
  1. Gdzie inicjujesz zmienną ileDodanoOsob?

To jest zmienna globalna, więc automagicznie jest inicjowana 0

Wolson napisał(a):

Inicjuje zaraz pod struct. Czy w zapisywaniu i odczytywaniu popełniam błąd bo nie rozumiem ?

Dla każdego pola zapisujesz dwie wartości: Nazwę pola(Imię,Nazwisko,etc.) oraz wartość pola. Ale wczytujesz już tylko same wartości.
Czyli:
file >> pracownicy[j].imie wczytuje "Imię:"
file >> pracownicy[j].nazwisko wczytuje "Jan"
file >> pracownicy[j].wiek wczytuje "Kowalski" (a miał być tutaj int, więc już jest klops)
...i tak dalej.
Kończy się tym, że wszystko jest wymieszane i tam gdzie miał być string jest int, tam gdzie miał być int jest string.

0
tajny_agent napisał(a):
Delor napisał(a):
  1. Gdzie inicjujesz zmienną ileDodanoOsob?

To jest zmienna globalna, więc automagicznie jest inicjowana 0

Wolson napisał(a):

Inicjuje zaraz pod struct. Czy w zapisywaniu i odczytywaniu popełniam błąd bo nie rozumiem ?

Dla każdego pola zapisujesz dwie wartości: Nazwę pola(Imię,Nazwisko,etc.) oraz wartość pola. Ale wczytujesz już tylko same wartości.
Czyli:
file >> pracownicy[j].imie wczytuje "Imię:"
file >> pracownicy[j].nazwisko wczytuje "Jan"
file >> pracownicy[j].wiek wczytuje "Kowalski" (a miał być tutaj int, więc już jest klops)
...i tak dalej.
Kończy się tym, że wszystko jest wymieszane i tam gdzie miał być string jest int, tam gdzie miał być int jest string.

Dzięki wielkie za pomoc teraz wszystko działa jak należy.

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