mikewazowski Temat założony przez niniejszego użytkownika |
odczyt z pliku (struktury, lista dwukierunkowa) » 2017-01-11 23:49:49 plik intnieje i jest pusty - komunikat że dane zostają wczytane, jeśli plik zawiera dane to cały program się zawiesza i nie wczytuje danych oraz nie zwraca komunikatu "blad otwarcia pliku" #include <iostream> #include <string> #include <cstdlib> #include <cstdio> using namespace std; struct Dane { string imie; string nazwisko; string dataur; string ulica; string miasto; string inne; int id; }; struct Student { Dane dane; Student * next; Student * prev; static int num_of_students; }; int Student::num_of_students = 0;
Student * stworzelement() { Student * element; string imie; string nazwisko; string dataur; string ulica; string miasto; string inne; int id = ++Student::num_of_students; cout << "ID: " << id << endl; cout << "podaj imie: "; cin >> imie; cout << "podaj nazwisko: "; cin >> nazwisko; cout << "podaj date urodzenia: "; cin.sync(); getline( cin, dataur ); cout << "podaj ulice i numer domu: "; cin.sync(); getline( cin, ulica ); cout << "podaj miasto: "; cin.sync(); getline( cin, miasto ); cout << "podaj inne dane: "; cin.sync(); getline( cin, inne ); element = new Student(); element->next = NULL; element->prev = NULL; element->dane.id = id; element->dane.imie = imie; element->dane.nazwisko = nazwisko; element->dane.dataur = dataur; element->dane.ulica = ulica; element->dane.miasto = miasto; element->dane.inne = inne; return element; } int dodajkoniec( Student ** head ) { Student * pom; if( * head == NULL ) { Student * tmp = stworzelement(); * head = tmp; cout << "***dodano do bazy***" << endl; } else { Student * tmp = stworzelement(); pom = * head; while( pom->next != NULL ) { pom = pom->next; } tmp->prev = pom; pom->next = tmp; cout << "***dodano do bazy***" << endl; } } void odczyt_z_pliku( Student ** head ) { string imie; string nazwisko; string dataur; string ulica; string miasto; string inne; int id; FILE * wczytaj = NULL; string nazwa, nazwa_pliku; cout << "podaj nazwe pliku: "; cin.sync(); getline( cin, nazwa ); nazwa_pliku = nazwa + ".txt"; Student * tmp, * pom; wczytaj = fopen( nazwa_pliku.c_str(), "r" ); if( wczytaj == NULL ) cout << "blad otwarcia pliku" << endl; else { while( fscanf( wczytaj, "%s" ) != EOF ) { tmp = new Student(); tmp->next = NULL; tmp->prev = NULL; fscanf( wczytaj, "%d" ); tmp->dane.id = id; fscanf( wczytaj, "%s" ); tmp->dane.imie = imie; fscanf( wczytaj, "%s" ); tmp->dane.nazwisko = nazwisko; fscanf( wczytaj, "%s" ); tmp->dane.dataur = dataur; fscanf( wczytaj, "%s" ); tmp->dane.ulica = ulica; fscanf( wczytaj, "%s" ); tmp->dane.miasto = miasto; fscanf( wczytaj, "%s" ); tmp->dane.inne = inne; if( * head == NULL ) * head = tmp; else { pom = * head; while( pom->next != NULL ) pom = pom->next; tmp->prev = pom; pom->next = tmp; } } printf( "Plik zostal wczytany" ); } fclose( wczytaj ); }
|
|
darko202 |
» 2017-01-12 08:25:29 1. zapoznaj się z techniką debugowania programu i nie pisz więcej, że program Ci się zawiesza. Dowiedz się co faktycznie program robi i która linia sprawia problem najprostszy debuger to cout << "zmieniana zmienna"; 2. popatrz na przykład zastosowania fscanf z http://www.cplusplus.com/reference/cstdio/fscanf/fscanf (pFile, "%s", str); i jak jest u Ciebie - czytasz je, ale gdzie lądują wczytane dane ? 3. //co będzie gdy w innym miejscu niż warunku "while" przeczytasz EOF while( fscanf( wczytaj, "%s" ) != EOF ) { ... fscanf( wczytaj, "%d" ); //co jak tu przeczytasz EOF ... fscanf( wczytaj, "%s" ); //co jak tu przeczytasz EOF ... //itd. co jak tu przeczytasz EOF ... } ewidentnie zła konstrukcja - w jednym miejscu kodu czytasz z pliku, a potem badasz co przeczytałeś 4. ja wyżej ale %s w fscanf oznacza s String of characters Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence. czyli rodzi się pytanie co właściwie robią kolejne wywołania fscanf ? piszę bo nie wiem jak wyglądają dane, czy są odpowiednio sformatowane ? |
|
mikewazowski Temat założony przez niniejszego użytkownika |
» 2017-01-13 16:10:37 program zmodyfikowany, ale nadal nie chce zapisywać danych z pliku jako nowe struktury na liscie dwukierunkowej void odczyt() { Student * tmp, * pom, * head; string nazwa, nazwa_pliku; fstream plik; cout << "podaj nazwe pliku: "; cin.sync(); getline( cin, nazwa ); nazwa_pliku = nazwa + ".txt"; plik.open(( nazwa_pliku ).c_str(), ios::in ); if( plik.good() ) { usun_liste( & head ); tmp = new Student(); tmp->next = NULL; tmp->prev = NULL; while( !plik.eof() ) { Student * pom; if( * head == NULL ) { string imie; getline( plik, imie ); tmp->dane.imie = imie; string nazwisko; getline( plik, nazwisko ); tmp->dane.nazwisko = nazwisko; int id; getline( plik, id ); cout << "id: " << id; tmp->dane.id = id; string dataur; getline( plik, dataur ); tmp->dane.dataur = dataur; string ulica; getline( plik, ulica ); string miasto; getline( plik, miasto ); tmp->dane.miasto = miasto; string inne; getline( plik, inne ); tmp->dane.inne = inne; * head = tmp; cout << "***dodano do bazy***" << endl; } else { tmp = new Student(); tmp->next = NULL; tmp->prev = NULL; string imie; getline( plik, imie ); tmp->dane.imie = imie; string nazwisko; getline( plik, nazwisko ); cout << "nazwisko: " << nazwisko << endl; tmp->dane.nazwisko = nazwisko; int id; getline( plik, id ); cout << "id: " << id; tmp->dane.id = id; string dataur; getline( plik, dataur ); tmp->dane.dataur = dataur; string ulica; getline( plik, ulica ); tmp->dane.ulica = ulica; string miasto; getline( plik, miasto ); tmp->dane.miasto = miasto; string inne; getline( plik, inne ); tmp->dane.inne = inne; pom = * head; while( pom->next != NULL ) { pom = pom->next; } tmp->prev = pom; pom->next = tmp; cout << "***dodano do bazy***" << endl; } } } plik.close(); } else cout << "Error! Nie udalo otworzyc sie pliku!" << endl;
}
|
|
karambaHZP |
» 2017-01-13 17:03:12 Debugger i do dzieła. Tego kodu masz tam z dwa razy za dużo: string ulica; getline( plik, ulica ); tmp->dane.ulica = ulica; |
| | v getline( plik, tmp->dane.ulica ); |
|
« 1 » |