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

Problem z zapisaem/odczytem z pliku w C++

Ostatnio zmodyfikowano 2011-01-16 14:49
Autor Wiadomość
Zuza
Temat założony przez niniejszego użytkownika
Problem z zapisaem/odczytem z pliku w C++
» 2011-01-15 22:41:25
Witam Was, siedzę nad moją bazą danych pracowników. Do tej pory miałam zapis i odczyt z pliku napisany w C i wszystko śmigało. Dziś postanowiłam przepisać to na C++, bo lepszy, nowszy, bo warto się uczyć. I się zaczęło.

Uczę się z samouczków, waszych lekcji, ogólnie internetu i nie do końca wiem, co robię źle. Używam Dev C++ 4.9.9.2. Program się kompiluje, tyle tylko, że po wybraniu zapisu lub odczytu do pliku nie wykonuje zadania. Nie wyskakuje błąd, ani nic, tylko po tym, jak po odczycie wybieram wyświetlenie danych pobranych z pliku nic się nie wyświetla (a ta sama funkcja kiedy odczytywałam i zapisywałam w C działała pięknie, więc to raczej błąd w odczycie).

Czy ktoś z Was mógłby rzucić wprawnym okiem w funkcje zapisu i odczytu i powiedzieć mi, co jest nie tak?
 
C/C++
void wczytaj() {
    int a, i;
    fstream plik( "administracja.txt", ios::in );
    for( i = 0; i < N; i++ ) {
        plik >> a;
        plik >> spis[ a ].imie;
        plik >> spis[ a ].naz;
        plik >> spis[ a ].stan;
        plik >> spis[ a ].adres.ulica;
        plik >> spis[ a ].adres.nr;
        plik >> spis[ a ].adres.miasto;
        plik >> spis[ a ].tel;
        plik >> spis[ a ].pen;
    }
    plik.close();
}
void zapisz() {
    int a, i;
    fstream plik( "administracja.txt", ios::out );
    for( a = 1; a <( N - 1 ); a++ ) {
        plik << a;
        plik << spis[ a ].imie;
        plik << spis[ a ].naz;
        plik << spis[ a ].stan;
        plik << spis[ a ].adres.ulica;
        plik << spis[ a ].adres.nr;
        plik << spis[ a ].adres.miasto;
        plik << spis[ a ].tel;
        plik << spis[ a ].pen;
    }
    plik.close();
}

I jeszcze funkcja wyświetlająca, gdybym przypadkiem się myliła i bład był jednak w wyświetlaniu:

 
C/C++
void wyswietl() {
    int a;
    cout <<( "Spis pracownikow: " ) << endl;
    for( a = 1; a <=( N - 1 ); a++ ) {
        if( spis[ a ].tel != 0 ) {
            cout <<( "Pozycja nr: " ) << a << endl;
            cout <<( "Imie: " );
            cout << spis[ a ].imie << endl;
            cout <<( "Nazwisko: " );
            cout << spis[ a ].naz << endl;
            cout <<( "Stanowsiko: " );
            cout << spis[ a ].stan << endl;
            cout <<( "Adres: ulica: " );
            cout << spis[ a ].adres.ulica << endl;
            cout <<( "Adres: nr domu: " );
            cout << spis[ a ].adres.nr << endl;
            cout <<( "Adres: miasto: " );
            cout << spis[ a ].adres.miasto << endl;
            cout <<( "Telefon: " );
            cout << spis[ a ].tel << endl;
            cout <<( "pensja: " );
            cout << spis[ a ].pen << endl << endl << endl;
        }
    }
}


P-26580
dmx81
» 2011-01-15 22:55:24
po pierwsze co mi sie rzucilo w oczy to
C/C++
cout <<( "napis" ); // zamien na:
cout << "napis";

czyli lancuch znakow bez nawiasow

po drugie nie wiem czy to zamierzone - ale zapisujesz numerujac od  1 a wczytujesz od 0

po trzecie uzywasz zapisu

C/C++
tab[ i ].zmienna; // a pewnie powinno byc
tab[ i ]->zmienna; // chyba, ze uzywasz wektora obiektow a nie wskaznikow

najlepiej jednak, aby wrzucic caly program (ewentualnie wrzucic gdzies plik(i) - samemu probujac uruchomic program bedzie latwiej


ps. oczywiscie w podpowiedziach moglem sie tez pomylic lub czegos niedopatrzyc, sa duzo bardziej wprawieni ode mnie tu ;) wiec pewnie mnie poprawia
P-26584
Zuza
Temat założony przez niniejszego użytkownika
» 2011-01-15 23:06:32
Zamierzone, bo przy zapisie ma mi wyrzucac pierwsza liczbe jako liczbe porzadkowa, przy czym ma sie zpiasywac od jedynki (dlatego jest warunek, ze jak struktura z nr telefonu jest pusta, nie zapisuje nic, wtedy zapisuje mi po numerze struktury i mam to w kolejnosci, ale moze byc na przyklad 1 2 5, gdy 3 i 4 sa puste) a przy odczycie ma po prostu robic petle N razy, wiec nie jest istotne czy od 0 czy od jedynki.

Dzięki za radę z nawiasami. Choc i tak nadal nie działa.

Chyba powinna byc kropka, bo to chodzi o tablice struktur:
C/C++
struct T_adres { char ulica[ 20 ], nr[ 15 ], miasto[ 20 ]; };
struct prac { int tel; int pen; char imie[ 25 ]; char naz[ 25 ]; char stan[ 25 ]; T_adres adres; };
const int N = 10;
prac spis[ N ];

Dzięki, wiem, że sa tu ludzie bardziej i mniej zaawansowani, mam po rpsotu nadzieję, że wspólnymi siłami dojdziemy do tego, co jest źle. Po prostu chcę się nauczyć, jak to zrobić w C++, bo kiedy zrobiłam używając c (fprintf i fscanf) działało i hulało aż miło. Więc coś musiałam pogmatwać w poleceniach w C++. Tylko CO?
P-26586
dmx81
» 2011-01-15 23:09:48
j.w. najlepiej wkleic caly kod, ewentualnie wrzucic plik(i) i podac link do nich - duzo latwiej bedzie wychwycic blad

no chyba ze ktos w miedzy czasie znajdzie blad
P-26587
michalp
» 2011-01-15 23:13:37
C/C++
void wczytaj() {
    int a, i;
    fstream plik( "administracja.txt", ios::in );
    for( i = 0; i < N; i++ ) {
        plik >> a;
        plik >> spis[ i ].imie;
        plik >> spis[ i ].naz;
        plik >> spis[ i ].stan;
        plik >> spis[ i ].adres.ulica;
        plik >> spis[ i ].adres.nr;
        plik >> spis[ i ].adres.miasto;
        plik >> spis[ i ].tel;
        plik >> spis[ i ].pen;
    }
    plik.close();
}

Znajdź różnicę ;) (i zobacz czy działa)
P-26589
dmx81
» 2011-01-15 23:19:49
no taaak :) ale ciiiiii nie podpowiadamy ;)

ps - tym tez sie rozni C++ od C - miejscem deklaracji/definicji zmiennych, w C bylo wszytsko na poczatku funkcji main(), a tu kiedy jej potrzeba uzyc(m.in w nawiasie for'a) - ups, czyzby podpowiedz?
P-26590
Zuza
Temat założony przez niniejszego użytkownika
» 2011-01-15 23:21:24
Różnicę widzę ;) Z tego co rozumiem, to będzie zapisywało w strukturze z indeksem i, a ja umyślnie chciałam, żeby zapisyłało w strukturze z indeksem a. Wtedy pierwsza liczba w pliku bylaby nr porządkowym, a zapisywałoby mi w strukturze równej nr porządkowemu. Tam, gdzie nie byłoby danych, albo gdzie nie ma danych (np jest osoba o nr 1, ale kolejna jest o nr 3) zostawi mi pusta tablice. Czyli spis[1] bedzie, spis[2] bedzie puste, a spis [3] znow będzie. Ale zaraz sprawdze, moze sie myle ;)

tutaj sa pliki o ktorych mowa: jeden dzialajacy jak trzeba, jeden przpeisany zapis/odczyt do C++ i NIE dzialajacy i plik txt z ktorego zapisuje/odczytuje:

http://wrzucacz.pl/file/4091295129797
P-26591
dmx81
» 2011-01-15 23:25:42
uruchomilem "niedzialajaca wersje"

dalem na odczyt z pliku - pozniej na wyswietlenie pracownikow no i dziala, natomiast jak dalem na dodanie nowego pracownika - wypisalem rubryki, a po ostatniej pozycji i wcisnieciu entera zaczelo sie drukowac na ekran cale menu ale jedno za drugim (tylko zamkniecie okna moglo pomoc)

proponuje rowniez

1. dodac informacje typu "wczytano liste pracownikow" po uzyciu opcji wczytaj
2. "lista jest pusta" po wyswietleniu pracownikow - jesli jest pusta/brak wpisow
3. proponuje rowniez dla telefon, pensja(o ile nie beda te dane dodawane itd) zmienic ich format na char lub wprowadzic sprawdzanie typu, bo jest mozliwosc wpisania czegokolwiek i program moze sie np zawiesic
P-26593
« 1 » 2
  Strona 1 z 2 Następna strona