Binarna baza a usuwanie wpisów
Ostatnio zmodyfikowano 2013-01-01 17:01
tomipnh Temat założony przez niniejszego użytkownika |
Binarna baza a usuwanie wpisów » 2012-12-30 23:09:17 Piszę mały program na zaliczenie, ma być to baza dla hurtowni: towar, cena, ilość. Generalnie nic trudnego, mam kilka podpunktów do zrobienia, dodanie wpisów, edycja, usuwanie wpisów oraz kasacja pliku. Wszystko ładnie szło do momentu wzięcia się za usuwanie wpisów. Internet podpowiedział i nagrodził snippletem by liczyć linie, wrzucać je do momentu trafienia na tą do usunięcia, ominięcia jej i wrzucenie pozostałych a następnie przewalenie zawartości pliku temp do głównego data. Przyznam, że całe g rozumiem z tego kawałka kodu, ale starałem się dodać warunek sprawdzający czy dana linia w ogóle istnieje. Bo pojawiał się błąd i dokopiowywało mi bezsensu kilkanaście razy ostatnią linie. O tej porze już nie myśle, mógłby ktoś rzucić okiem i pokazać mi co tam jest namieszane? Sposób wykonania jest straszny, ale działał do momentu sprawdzania co będzie 'gdy'. void recordDel() { system( "cls" ); hurt hurtownia; int k; int size1 = 0, size2 = 0; std::fstream file1( "data.dat", std::ios::binary | std::ios::in | std::ios::out ); std::ofstream file2( "trunk.tmp", std::ios::binary | std::ios::out ); std::cout << "ktory rekord chcesz usunac? : "; std::cin >> k; size2 =( sizeof( struct hurt ) *( k - 1 ) ); if( k - 1 <=( sizeof( struct hurt ) ) ) { while( 1 ) { file1.read( reinterpret_cast < char *>( & hurtownia ), sizeof( hurtownia ) ); if( size1 == size2 ) break; file2.write( reinterpret_cast < char *>( & hurtownia ), sizeof( hurtownia ) ); size1 = size1 + sizeof( struct hurt ); } file1.close(); file2.close(); std::fstream file3( "data.dat", std::ios::binary | std::ios::in | std::ios::out ); std::ofstream file4( "trunk.tmp", std::ios::binary | std::ios::out | std::ios::app ); file3.seekp( sizeof( struct hurt ) *( k ) ); while( 1 ) { file3.read( reinterpret_cast < char *>( & hurtownia ), sizeof( hurtownia ) ); if( file3.eof() ) break; file4.write( reinterpret_cast < char *>( & hurtownia ), sizeof( hurtownia ) ); } file3.close(); file4.close(); std::fstream file5( "trunk.tmp", std::ios::binary | std::ios::in | std::ios::out ); std::fstream file6( "data.dat", std::ios::binary | std::ios::in | std::ios::out | std::ios::trunc ); while( 1 ) { file5.read( reinterpret_cast < char *>( & hurtownia ), sizeof( hurtownia ) ); if( file5.eof() ) break; file6.write( reinterpret_cast < char *>( & hurtownia ), sizeof( hurtownia ) ); } file6.close(); file5.close(); remove( "trunk.tmp" ); } else { std::cout << "Nie ma takiej linii"; getch(); system( "cls" ); } }
|
|
DejaVu |
» 2012-12-30 23:45:05 Najłatwiej: wczytaj cały plik do pamięci, usuń rekord z pamięci i zapisz zawartość pamięci do pliku. |
|
tomipnh Temat założony przez niniejszego użytkownika |
» 2013-01-01 17:01:48 Dziękuje za odpowiedź, dopiero dzisiaj jestem w stanie odpisać ;-) Popatrzyłem w jaki sposób należałoby to zrobić wg podsuniętego przez Ciebie pomysłu i obawiam się, że to grubo przekracza zakres materiału. Może na drugim semestrze ale na chwilę obecną nasz materiał doszedł do plików binarnych ze wspomnieniem, że takie coś jak wskaźnik istnieje. W związku z tym nie chciałbym za bardzo się wychylać. Można to jeszcze w jakiś inny - i prosty - sposób zrobić by belfrowi, który wydaje się nie wiedzieć dużo więcej niż to co przewiduje sylabus nie zaleźć zanadto za skórę? Może da się uprościć jakoś? Zamiast otwierać i zamykać pliki w tą i nazad bo gubi się przy tym. Cho*ra, jakby to tekstowe było to jakimś grepem zrobił olewając usuwany wpis.
Pozdrawiam, po sylwestrze |
|
« 1 » |