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

C++ problem z dopisywanie danych do struktury w pliku binarnym

Ostatnio zmodyfikowano 2018-01-25 22:15
Autor Wiadomość
lapus
Temat założony przez niniejszego użytkownika
C++ problem z dopisywanie danych do struktury w pliku binarnym
» 2018-01-23 16:00:36
Mam plik binarnym w którym dodaje do pliku binarnego uczniów, następnie chcę móc wybrać ucznia któremu chcę dodać ocenę, ale plik się nie edytuje tam gdzie potrzeba.
C/C++
struct oceny {
    int ocena;
};
struct dziennik {
    char imie[ 20 ], nazwisko[ 20 ], pesel[ 20 ];
    oceny polski;
    oceny angielski;
    oceny matematyka;
   
   
};
C/C++
void dodaj_angielski()
{
    dziennik uczen;
    int wybor;
    cout << "Ktoremu uczniowi chcesz dodac ocene: " << endl;
    lista();
    cin >> wybor;
   
   
   
    fstream plikOdczyt1( "dzienniklekcyjny.dat", ios::binary | ios::ate );
    plikOdczyt1.seekg( sizeof( struct dziennik ) *( wybor - 1 ) );
    plikOdczyt1.seekp( sizeof( struct dziennik ) *( wybor - 1 ) );
    plikOdczyt1.read( reinterpret_cast < char *>( & uczen ), sizeof( uczen ) );
   
    cout << uczen.imie << " " << uczen.nazwisko;
    cout << "Podaj ocene: ";
    cin >> uczen.angielski.ocena;
    cout << endl;
    cout << "Podales: " << uczen.angielski.ocena;
    plikOdczyt1.write( reinterpret_cast < char *>( & uczen ), sizeof( uczen ) );
    cout << uczen.imie << " " << uczen.nazwisko << " " << uczen.angielski.ocena;
    plikOdczyt1.close();
    lista();
   
}
P-168946
pekfos
» 2018-01-23 19:31:37
Przenieś wywołanie seekp tuż przed write.
P-168953
lapus
Temat założony przez niniejszego użytkownika
» 2018-01-24 00:25:54
Dodaje ocene na swoję miejsce, ale edytuje też  imie i nazwisko. No i usuwa ucznia 2. i kolejnych jeśli jest więcej. Podejrzewam że to przez to że zapisuje cały blok danych? ale
plikOdczyt1 << uczen.angielski.ocena;
 jest jeszcze gorzej.
C/C++
void dodaj_angielski()
{
    dziennik uczen;
    int wybor;
    cout << "Ktoremu uczniowi chcesz dodac ocene: " << endl;
    lista();
    cin >> wybor;
   
    ofstream plikOdczyt1( "dzienniklekcyjny.dat", ios::binary | ios::out | ios::ate );
   
   
    cout << "Podaj ocene: ";
    cin >> uczen.angielski.ocena;
   
    plikOdczyt1.seekp( sizeof( struct dziennik ) *( wybor - 1 ) );
    plikOdczyt1.write( reinterpret_cast < char *>( & uczen ), sizeof( uczen ) );
   
    plikOdczyt1.close();
    lista();
   
   
}

Konsola
1:Dodaj ocene z angielskiego
2:Dodaj ocene z polskiego
3:Dodaj ocene z matematyki
0:Wyjdz
1
Ktoremu uczniowi chcesz dodac ocene:
1. Imie: anna Nazwisko: kownacka Angielski: 1.01341e-038 Polski: 4.23518e-022 Matematyka: 1.12104e-044
2. Imie: adam Nazwisko: michniuk Angielski: 1.01347e-038 Polski: -1.54086e-033 Matematyka: 3.92364e-044
1
Podaj ocene: 6
1. Imie:  Nazwisko: 1 Angielski: 6 Polski: 1.4013e-044 Matematyka: 1.4013e-044
P-168957
pekfos
» 2018-01-24 00:52:01
Otwórz plik w trybie in | out | binary i modyfikuj rekord wczytany z pliku, a nie nowy pusty.
P-168958
lapus
Temat założony przez niniejszego użytkownika
» 2018-01-24 10:45:56
Działa świetnie
C/C++
void dodaj_angielski()
{
    dziennik uczen;
    int wybor;
    cout << "Ktoremu uczniowi chcesz dodac ocene: " << endl;
    lista();
    cin >> wybor;
   
    fstream plikOdczyt1( "dzienniklekcyjny.dat", ios::binary | ios::in | ios::out | ios::ate );
    plikOdczyt1.seekg( sizeof( struct dziennik ) *( wybor - 1 ) );
    plikOdczyt1.read( reinterpret_cast < char *>( & uczen ), sizeof( uczen ) );
   
    cout << "Podaj ocene: ";
    cin >> uczen.angielski.ocena;
   
    plikOdczyt1.seekp( sizeof( struct dziennik ) *( wybor - 1 ) );
    plikOdczyt1.write( reinterpret_cast < char *>( & uczen ), sizeof( uczen ) );
   
    plikOdczyt1.close();
    lista();
}

Tylko jeśli chcę teraz móc dopisać kolejną ocenę, dodaje wtedy
ios::app
 to tworzy kolejną strukturę o takich samych danych oprócz zmodyfikowanej oceny.

Ktoremu uczniowi chcesz dodac ocene:
1. Imie: Jan Nazwisko: KowalskiTelefon: 517 PESEL: 98 Angielski: 5 Polski: 1 Matematyka: 4
1
Podaj ocene: 6
1. Imie: Jan Nazwisko: KowalskiTelefon: 517 PESEL: 98 Angielski: 5 Polski: 1 Matematyka: 4
2. Imie: Jan Nazwisko: KowalskiTelefon: 517 PESEL: 98 Angielski: 6 Polski: 1 Matematyka: 4

A moim zamiarem jest uzyskanie czegoś takiego.
Ktoremu uczniowi chcesz dodac ocene:
1. Imie: Jan Nazwisko: KowalskiTelefon: 517 PESEL: 98 Angielski: 5 Polski: 1 Matematyka: 4
1
Podaj ocene: 6
1. Imie: Jan Nazwisko: KowalskiTelefon: 517 PESEL: 98 Angielski: 5 6 Polski: 1 Matematyka: 4
P-168961
pekfos
» 2018-01-24 13:53:21
C/C++
struct oceny {
    int ile;
    int ocena[ MaxOcen ];
};
P-168965
lapus
Temat założony przez niniejszego użytkownika
» 2018-01-24 15:11:48
Jeśli chcę zapisywać ilość w
int ile
 to muszę wczytać tą wartość, ustawić sobie jakaś zmienną pom w funkcji
dodaj_angielski()
,
int pom = uczen.angielski.ile
w trakcie dodawania kolejnych elementów do tablicy
pom++
 a przed zapisaniem ustawić
uczen.angielski.ile = pom;
. Czy da się jakoś prościej zwiększać tą wartość ile, jeśli chcę uzyć po prostu
ile++; / uczen.angielski[ ile ];
 to  error  'ile' was not declared in this scope.
P-168967
pekfos
» 2018-01-24 16:07:19
A może by tak po prostu
C/C++
uczen.angielski.ile++
P-168968
« 1 » 2
  Strona 1 z 2 Następna strona