Jak wyszukać słowo w pliku binarnym?

0

witam!
chcialbym wyszukac slowo w pliku binarnym. Jak to zrobic?

0

A duży masz ten plik binarny? Ile bajtów?

0
char imie[20];
char nazwisko[20];
int dzien, mies, rok;
int id2;
char marka[20];
char rejestracja[10];
char model[20];

taka struktura

0

Jeśli jest to słowo stałe (czyt. nie regexp czy coś zależnego od treści) i grep -aF jest poza grą, to najszybciej będzie mmap pliku i potem wybierasz sobie coś z tej listy.

0

Z tego co widzę, plik jest podzielony na paczki danych o takim samym rozmiarze. Tak więc jeśli potrzebujesz znaleźć w tym pliku np. konkretne imię, to wystarczy użyć strumienia i postępować według poniższego schematu:

  • otwierasz plik,
  • ustawiasz znacznik na pierwszy jego bajt (choć zapewne domyślnie jest na początku),
  • w pętli, jeśli nie koniec pliku:
    • wczytujesz 20 bajtów, bo tyle zajmuje pole imie,
    • jeśli imię jest równe wzorcowi:
      • przerywasz działanie pętli
    • a jeśli jest inne:
      • przesuwasz znacznik w pliku o rozmiar struktury minus 20 bajtów (czyli minus rozmiar pola imie).

Tak samo możesz postępować z wyszukiwaniem innych informacji.

Jeśli chcesz znaleźć nazwisko to ustawiasz kursor na numer bajtu pola nazwisko w swojej strukturze (czyli na 21 bajt) i tak samo – wczytujesz po 20 bajtów i przesuwasz się o rozmiar struktury minus 20 bajtów. Jeśli potrzebujesz znaleźć np. dzień, to ustawiasz znacznik na 41 bajt, ładujesz po 4 bajty (ogólnie: po tyle, ile wynosi rozmiar int) i przesuwasz się o rozmiar struktury minus 4 bajty.

Sposób bardzo szybki, nie zjadający pamięci.

0
void baza::wyszukaj() {
    baza p;
    char rejestr[10];
    ifstream plik("pojazd.dat", ios::binary);
    cout << "Podaj numer rejestracyjny: " << endl;
    cin >> rejestr;
    for (int i = 1;; i++) {
        plik.read(reinterpret_cast<char*>(&p), sizeof(p));

        if (plik.eof()) break;      
        if (p.rejestracja == rejestr) {
            cout << "Marka: " << p.marka << endl;
            cout << "Model: " << p.model << endl;
            cout << "Nr rejestracyjny: " << p.rejestracja << endl;
            break;
        }
    }
    plik.close();

}

zrobilem cos takiego ale nie dziala :/

0
if (plik.eof()) break;

A to dlaczego jest w środku pętli? To powinien być główny warunek pętli:

while(!plik.eof())
{
  // ładowanie danych do pamięci
  // sprawdzenie czy pasują do wzorca i ew. przerwanie działania pętli
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0