cancer Temat założony przez niniejszego użytkownika |
[C++] Wczytywanie danych z pliku do zmiennych (różne typy) » 2014-01-24 15:44:03 Witam, Mam program, który zapisuje do pliku dane z list... Wymyśliłem, że jeżeli zapiszę je tak: baza.open( "baza.txt", ios::in ); baza << temp->id << ";;" << temp->nazwisko << ";;" << temp->specjalnosc << ";;" << temp->srednia << endl; to nie będę miał problemów z odczytem, jednak nie mogę sobie z nim poradzić, ponieważ są to inne typy zmiennych (int, string, string, float)... Myślałem nad czymś takim baza >> temp->id >> ";;" >> temp->nazwisko >> ";;" >> temp->specjalnosc >> ";;" >> temp->srednia >> "\n"; ale to nie chodzi... Albo nad czymś takim: baza >> temp->id >> temp->nazwisko >> temp->specjalnosc >> temp->srednia; ale to tym bardziej nie chodzi... Na początku chciałem to zrobić tak (część kodu - dla zmiennej id): getline( baza, linia ); while( linia[ i ] != '\n' ) { if( zmienna == 0 ) { while(( int )( linia[ i ] ) != 59 ) { while(( int )( linia[ i ] ) != 59 ) { chwilowy[ j ] = linia[ i ]; i++; j++; } i++; } temp->id =( int )( chwilowy ); j = 0; zmienna++; } }
Jednak problem pojawił się przy rzutowaniu, ponieważ mi go nie puszczało... Próbowałem zrobić to jeszcze innym sposobem: baza.open( "baza.txt", ios::in ); if( baza.good() ) { while( true ) { baza >> temp->id >> temp->nazwisko >> temp->specjalnosc >> temp->srednia; if( baza.good() ) temp = temp->nastepna; else break; } baza.close(); } Lecz wyrzuciło mi błąd: Unhandled exception at 0x689E2208 (msvcp110d.dll) in projekt2.exe: 0xC0000005: Access violation writing location 0x00000000. |
Możecie mi jakoś pomóc? Coś poradzić? Bo muszę jakoś ten odczyt z pliku wykombinować, żeby mi mógł do zmiennych przypisywać. Pozdrawiam |
|
pekfos |
» 2014-01-24 18:50:32 to nie będę miał problemów z odczytem |
Efekt odwrotny. Jako separatorów używaj spacji, lub innego białego znaku. Wtedy wszystko wczytasz w jednym ciągu (ten "tym bardziej niedziałający sposób"). Jedyny problem, jaki może być, to spacja w stringu. To możesz rozwiązać na 2 sposoby: zmień przy zapisie spację na inny znak, a po odczytaniu z powrotem zmień na spację, lub zmień separator na inny biały znak, a string wczytuj przez getline(). Jeśli chcesz pozostać przy separatorach, które nie są białymi znakami, to najlepszym sposobem będzie wczytywanie wszystkiego przez getline() i konwertowanie danych na określone typy. Próbowałem zrobić to jeszcze innym sposobem: |
Elementy listy same się nie tworzą. Strzelam, że to jest przyczyną. |
|
cancer Temat założony przez niniejszego użytkownika |
» 2014-01-24 19:18:57 Czyli jak mogę to wczytać? Bo getline musi być chyba przypisane do jakiegoś stringa, tak? A potem jak to będę konwertował to tak tego stringa podzielić? |
|
pekfos |
» 2014-01-24 19:21:51 A potem jak to będę konwertował to tak tego stringa podzielić? | getline() automatycznie podzieli, jak mu podasz separator. |
|
cancer Temat założony przez niniejszego użytkownika |
Podział getline() » 2014-01-24 21:07:09 OK. Tylko mam problem z typem zmiennych... Zrobiłem to tak: void lista::wczytaj_liste() { osoba * temp = pierwsza; fstream baza; int i = 0; string item; vector < int > elInt; vector < float > elFloat; vector < string > elString; baza.open( "baza.txt", ios::in ); if( baza.good() ) { while( true ) { while( getline( baza, item, ' ' ) ) { if( i == 0 ) elInt.push_back( item ); if( i == 1 || i == 2 ) elString.push_back( item ); else elFloat.push_back( item ); i++; } temp->id = elInt[ 0 ]; temp->nazwisko = elString[ 0 ]; temp->specjalnosc = elString[ 1 ]; temp->srednia = elFloat[ 0 ]; if( baza.good() ) temp = temp->nastepna; else break; } baza.close(); } }
Ale są błędy przy kropce w elInt.push_back( item ); lub wersji z Float. Czyli chyba właśnie przez to, że item ma typ String... Nie wiem co zrobić, żeby to było dobrze... |
|
pekfos |
» 2014-01-24 21:41:40 Konwertuj ręcznie. Jest do tego pełno różnych funkcji itp. |
|
cancer Temat założony przez niniejszego użytkownika |
atoi()... Dlaczego nie działa? » 2014-01-24 21:44:49 Użyłem atoi(): while( true ) { while( getline( baza, item, ' ' ) ) { el.push_back( item ); } temp->id = atoi( el[ 0 ].c_str() ); temp->nazwisko = el[ 1 ]; temp->specjalnosc = el[ 2 ]; temp->srednia = atoi( el[ 3 ].c_str() ); if( baza.good() ) temp = temp->nastepna; else break; }
Lecz wyświetla mi komunikat: Unhandled exception at 0x689E2208 (msvcp110d.dll) in projekt2.exe: 0xC0000005: Access violation writing location 0x00000000. |
Wiecie może dlaczego nie mam dostępu do tego pliku? |
|
cancer Temat założony przez niniejszego użytkownika |
Znalazłem rozwiązanie problemu » 2014-01-24 22:10:48 Znalazłem rozwiązanie, wrzucę kod, jakby komuś mogło się kiedyś przydać. void lista::wczytaj_liste() { fstream baza; string item; vector < string > el; int elem = 0; baza.open( "baza.txt", ios::in ); if( baza.good() ) { while( true ) { while( getline( baza, item, ' ' ) ) { el.push_back( item ); elem++; } for( int rek = 0; rek < elem; rek = rek + 4 ) { osoba * nowa = new osoba; nowa->id = atoi( el[ rek % 4 ].c_str() ); nowa->nazwisko = el[ rek % 4 + 1 ]; nowa->specjalnosc = el[ rek % 4 + 2 ]; nowa->srednia = atof( el[ rek % 4 + 3 ].c_str() ); if( pierwsza == 0 ) { pierwsza = nowa; } else { osoba * temp = pierwsza; while( temp->nastepna ) { temp = temp->nastepna; } temp->nastepna = nowa; nowa->nastepna = 0; } } if( !baza.good() ) break; } baza.close(); } }
Dziękuję za pomoc i pozdrawiam :) |
|
« 1 » |