Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Test wyboru na plikach binarnych

Ostatnio zmodyfikowano 2014-01-30 16:16
Autor Wiadomość
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:
C/C++
#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.
P-103502
SeaMonster131
» 2014-01-29 14:36:08
Obecnie mam problem z programem
To za mało, opisz problem.
P-103508
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
P-103528
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.
P-103540
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.
P-103602
« 1 »
  Strona 1 z 1