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? 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: 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; } } }
|
|
dmx81 |
» 2011-01-15 22:55:24 po pierwsze co mi sie rzucilo w oczy to cout <<( "napis" ); 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 tab[ i ].zmienna; tab[ i ]->zmienna;
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 |
|
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: 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? |
|
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 |
|
michalp |
» 2011-01-15 23:13:37 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) |
|
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? |
|
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 |
|
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
|
|
« 1 » 2 |