[C++] Test wyboru na plikach binarnych
Ostatnio zmodyfikowano 2014-01-30 16:16
mrost13 Temat założony przez niniejszego użytkownika |
[C++] Test wyboru na plikach binarnych » 2014-01-29 13:05:59 Witam! Obecnie mam problem z programem, który ma losować i pobierać pytania z pliku, oto kod całego programu: #include<iostream> #include<fstream> #include<stdlib.h> #include<conio.h> #include<string.h> #include<windows.h> #include<time.h>
using namespace std;
struct pytanie { int nr; char tresc[ 1024 ]; char odpA[ 1024 ]; char odpB[ 1024 ]; char odpC[ 1024 ]; char odpD[ 1024 ]; char poprawna[ 2 ]; };
void dodaj(); void odczyt(); void menu(); void edycja(); void test();
int main( int argc, char ** argv ) { menu(); return 0; }
void menu() { int ilosc; SetConsoleTitle( "mrost13" ); int koniec = 1; int wybor; while( koniec ) { cout << "1- Dodaj"; cout << endl; cout << "2- Odczytaj"; cout << endl; cout << "3- Usun"; cout << endl; cout << "4- Test"; cout << endl; cout << "5- Edytuj"; cout << endl; cout << "6- Zakoncz"; cout << endl; cout << endl; cout << "Podaj numer: "; cin >> wybor; if( wybor == 6 ) { cout << "Program shutting down"; koniec = 0; } else { switch( wybor ) { case 1: { system( "cls" ); dodaj(); break; } case 2: { system( "cls" ); odczyt(); break; } case 3: { system( "cls" ); dodaj(); break; } case 4: { system( "cls" ); test(); break; } case 5: { system( "cls" ); edycja(); break; } default: cout << "Blad wyboru!" << endl; break; } system( "cls" ); } } };
void dodaj() { pytanie os; ofstream plik1( "test.dat", ios::binary | ios::app | ios::in ); cout << "Podaj tresc pytania: " << endl; cin.ignore( 1, '\n' ); cin.getline( os.tresc, 1024 ); cout << endl; cout << "Podaj 4 odpowiedzi: "; cout << endl; cout << "A) "; cin.getline( os.odpA, 1024 ); cout << endl; cout << "B) "; cin.getline( os.odpB, 1024 ); cout << endl; cout << "C) "; cin.getline( os.odpC, 1024 ); cout << endl; cout << "D) "; cin.getline( os.odpD, 1024 ); cout << endl << endl; cout << "Poprawna odpowiedz: "; cin.getline( os.poprawna, 2 ); cout << endl << endl << endl; plik1.write( reinterpret_cast < char *>( & os ), sizeof( os ) ); plik1.close(); menu(); };
void odczyt() { int i = 1; pytanie os; ifstream plik1( "test.dat", ios::binary | ios::app | ios::out ); while( 1 ) { plik1.read( reinterpret_cast < char *>( & os ), sizeof( os ) ); if( plik1.eof() ) break; cout << "Tresc pytania: " << endl; cout << os.tresc; cout << endl; cout << "Podaj 4 odpowiedzi: "; cout << endl; cout << "A) "; cout << os.odpA; cout << endl; cout << "B) "; cout << os.odpB; cout << endl; cout << "C) "; cout << os.odpC; cout << endl; cout << "D) "; cout << os.odpD; cout << endl << endl; i++; } getch(); plik1.close(); };
void edycja() { int k; pytanie os; cout << "Wybierz rekord do edycji"; cin >> k; fstream plik1( "test.dat", ios::binary | ios::out | ios::in ); plik1.seekp( sizeof( struct pytanie ) *( k - 1 ) ); plik1.read( reinterpret_cast < char *>( & os ), sizeof( os ) ); cout << "Tresc pytania: " << endl; cout << os.tresc; cout << endl; cout << "Podaj 4 odpowiedzi: "; cout << endl; cout << "A) "; cout << os.odpA; cout << endl; cout << "B) "; cout << os.odpB; cout << endl; cout << "C) "; cout << os.odpC; cout << endl; cout << "D) "; cout << os.odpD; cout << endl << endl; cout << "Poprawna odpowiedz: "; cout << os.poprawna; cout << endl << endl; cout << endl; cout << "Podaj tresc pytania: " << endl; cin.ignore( 1, '\n' ); cin.getline( os.tresc, 1024 ); cout << endl; cout << "Podaj 4 odpowiedzi: "; cout << endl; cout << "A) "; cin.getline( os.odpA, 1024 ); cout << endl; cout << "B) "; cin.getline( os.odpB, 1024 ); cout << endl; cout << "C) "; cin.getline( os.odpC, 1024 ); cout << endl; cout << "D) "; cin.getline( os.odpD, 1024 ); cout << endl << endl; cout << "Poprawna odpowiedz: "; cin.getline( os.poprawna, 2 ); cout << endl << endl << endl; plik1.write( reinterpret_cast < char *>( & os ), sizeof( os ) ); plik1.close(); menu(); };
void test() { pytanie os; fstream plik1( "test.dat", ios::binary | ios::app | ios::out ); srand( time( 0 ) ); int k, pkt; pkt = 0; char odp[ 2 ]; int l; cin >> k; for( int i = 1; k >= i; i = i + 1 ) { l =( rand() % k ) + 1; plik1.seekp( sizeof( struct pytanie ) *( l - 1 ) ); plik1.read( reinterpret_cast < char *>( & os ), sizeof( os ) ); cin.ignore( 1, '\n' ); cout << "Tresc pytania: " << endl; cout << os.tresc; cout << endl; cout << "Podaj 4 odpowiedzi: "; cout << endl; cout << "A) "; cout << os.odpA; cout << endl; cout << "B) "; cout << os.odpB; cout << endl; cout << "C) "; cout << os.odpC; cout << endl; cout << "D) "; cout << os.odpD; cout << endl << endl; cout << "Twoja odpowiedz: "; cin.getline( odp, 2 ); if( strcmp( odp, os.poprawna ) == 0 ) pkt = pkt + 1; system( "cls" ); }; cout << "Koniec testu!" << endl; cout << "Ilosc zdobytych punktow: " << pkt << endl; plik1.close(); getch(); system( "cls" ); menu(); }; Proszę o pomoc z tym problemem. |
|
SeaMonster131 |
» 2014-01-29 14:36:08 Obecnie mam problem z programem |
To za mało, opisz problem. |
|
mrost13 Temat założony przez niniejszego użytkownika |
» 2014-01-29 16:48:50 Program nie wczytuje danych z pliku, tylko puste pola. Naprawdę nie wiem jak to poprawić, skończyły mi siępomy |
|
leon_w |
» 2014-01-29 19:24:06 Rozumie, że chodzi o funkcje "test()". Pokombinuj tak: -Ustaw "ifstream" zamiast "fstream", -Dodaj na początku pętli for "plik1.clear();"
edit
I chyba funkcji "seekp()" używa się przy zapisie do pliku, a "seekg()" przy odczycie. |
|
SeaMonster131 |
» 2014-01-30 16:16:26 ios::in to odczyt danych, ios::out to zapis danych do pliku. Wydaje mi się, że je zrobiłeś odwrotnie w paru miejscach. |
|
« 1 » |