C++ problem z dopisywanie danych do struktury w pliku binarnym
Ostatnio zmodyfikowano 2018-01-25 22:15
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. struct oceny { int ocena; }; struct dziennik { char imie[ 20 ], nazwisko[ 20 ], pesel[ 20 ]; oceny polski; oceny angielski; oceny matematyka; }; 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(); } |
|
pekfos |
» 2018-01-23 19:31:37 Przenieś wywołanie seekp tuż przed write. |
|
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. 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 |
|
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. |
|
lapus Temat założony przez niniejszego użytkownika |
» 2018-01-24 10:45:56 Działa świetnie 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
|
|
pekfos |
» 2018-01-24 13:53:21 struct oceny { int ile; int ocena[ MaxOcen ]; }; |
|
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. |
|
pekfos |
» 2018-01-24 16:07:19 |
|
« 1 » 2 |