SzymSzym Temat założony przez niniejszego użytkownika |
Wczytywanie ciągu znaków do struktury. » 2017-08-30 19:30:47 Mój problem polega na tym, że kiedy wewnątrz struktury znajduje się zmienna typu string struct CD { string nazwa; string wykonawca; string kategoria; float cena; int numer; } disc;
To po jej wczytaniu z klawiatury wyświetla się komunikat, że program przestał działać. W przypadku, gdy w kodzie jest getline( cin, disc.nazwa );
To program przestaje działać jeszcze zanim cokolwiek wpiszę. Natomiast gdy użyję samego cin To program wywala się dopiero po wpisaniu danych. Ktoś wie coś na temat zmiennej typu string w strukturze, co mogło spowodować tego typu błąd? Dodam jeszcze, że nie jest to (raczej) wina błędu w kodzie, bo potem jest wczytanie pozostałych danych, które już się nie wykonuje, więc problemem jest ta linijka. |
|
pekfos |
» 2017-08-30 19:55:01 Może najpierw podaj kod, zanim stwierdzisz że nie w nim problem. |
|
karambaHZP |
» 2017-08-30 21:54:18 Skoro program się wywala pewnie pojawia się jakiś komunikat. Można go przytoczyć? |
|
mateczek |
» 2017-08-31 15:06:42 jeśli program przestaje działać i zwyczajnie się wysypuje. To jest to niestety przeważnie wina błędu w kodzie. Początkujący adept programowania raczej nie znajdzie bug-a w kompilatorze ;) |
|
SzymSzym Temat założony przez niniejszego użytkownika |
» 2017-09-04 16:26:17 void nowy() { bool flag; do { flag = false; cout << "Podaj numer przegrodki: "; cin >> disc.numer; cout << endl; for( int i = 0; i < ilosc; i++ ) { if( sloty[ i ] == disc.numer ) { cout << "Przegrodka zajeta. Sprobuj ponownie." << endl; system( "Pause" ); flag = true; } } } while( disc.numer < 1 || disc.numer > MAX || flag == true ); sloty[ ilosc ] = disc.numer; ilosc++; return; }
void zajete() { int i = 0; ilosc = 0; if(( baza = fopen( NAZWA_BAZA, "r" ) ) != NULL ) { while( fread( & disc, sizeof( disc ), 1, baza ) == 1 ) { sloty[ i ] = disc.numer; i++; ilosc++; } fclose( baza ); return; } else { cout << "Brak dostepu do bazy" << endl; return; } }
void dodaj() { if( ilosc >= MAX ) { cout << "Brak miejsca na kolejne plyty" << endl; system( "Pause" ); return; } if(( baza = fopen( NAZWA_BAZA, "a" ) ) == NULL ) { cout << "Brak dostepu do bazy" << endl; return; } cout << "Podaj dane plyty:" << endl << "Podaj nazwe plyty: "; getline( cin, disc.nazwa ); cout << endl << "Podaj wykonawce plyty: "; getline( cin, disc.wykonawca ); cout << endl << "Podaj kategorie plyty: "; getline( cin, disc.kategoria ); cout << endl << "Podaj cene plyty: "; cin >> disc.cena; nowy(); fwrite( & disc, sizeof( disc ), 1, baza ); fclose( baza ); return; }
int main() { char tryb; zajete(); do { cout << "Program obslugi kolekcji plyt" << endl << "1 Dodaj plyte" << endl << "2 Usun plyte" << endl << "3 Modyfikuj dane o plycie" << endl << "4 Zmien polozenie plyty" << endl << "5 Znajdz plyte" << endl; cout << "6 Wyswietl liste plyt" << endl << "7 Zakoncz" << endl; cin >> tryb; cout << endl; zajete(); switch( tryb ) { case '1': dodaj(); break; case '2': usun(); break; case '3': zmien(); break; case '4': przesun(); break; case '5': znajdz(); break; case '6': lista(); break; } } while( tryb != '7' ); return 0; }
Problem leży najprawdopodobniej w funkcji dodaj, przytaczanie pozostałych chyba nie ma sensu, bo i tak się nie wykonują, a jest ich sporo. |
|
Monika90 |
» 2017-09-04 16:46:59 fwrite( & disc, sizeof( disc ), 1, baza ); fread( & disc, sizeof( disc ), 1, baza )
Takim sposobem nie da się zapisywać ani odczytywać z pliku struktury zawierającej std::string, wymyśl coś innego. Nawet mamy artykuł na ten temat http://cpp0x.pl/artykuly/?id=72 |
|
SzymSzym Temat założony przez niniejszego użytkownika |
» 2017-09-04 21:48:26 Dodam jeszcze, że problem z wczytaniem łańcuchów do struktury występuje również w innych programach, bez dostępu do plików. Dotyczy zarówno obiektu cin jak i funkcji getline i zarówno tablic znaków jak i zmiennych typu string. |
|
mateczek |
» 2017-09-06 05:54:17 Dodam jeszcze, że problem z wczytaniem łańcuchów do struktury występuje również w innych programach, bez dostępu do plików. |
A z problemami w innych programach kontaktuj się z "wróżbita Maciej" (duży wybór narzędzi diagnostycznych :P fusy, tarot, kryształowa kula). Na forum obecnie brak jasnowidzów :P |
|
« 1 » 2 |