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

Binarna baza a usuwanie wpisów

Ostatnio zmodyfikowano 2013-01-01 17:01
Autor Wiadomość
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'.

C/C++
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" );
    }
   
   
}
P-72466
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.
P-72476
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
P-72621
« 1 »
  Strona 1 z 1