witam!
chcialbym wyszukac slowo w pliku binarnym. Jak to zrobic?
A duży masz ten plik binarny? Ile bajtów?
char imie[20];
char nazwisko[20];
int dzien, mies, rok;
int id2;
char marka[20];
char rejestracja[10];
char model[20];
taka struktura
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.
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
).
- przesuwasz znacznik w pliku o rozmiar struktury minus 20 bajtów (czyli minus rozmiar pola
- wczytujesz 20 bajtów, bo tyle zajmuje pole
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.
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 :/
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
}