BCB - Strutkura i wyszukiwanie

0

Witam
Jestem początkujący więc proszę o wyrozumiałość, chcę zrozumieć jak robić to w BCB by nie mieć podobnych problemów. Próbowałem swoimi sposobami ale jakoś mi nie wychodziło. A więc tak:
Tworzę w BCB aplikację która na podstawie wpisanej wartosci ID wyszukuje w pliku linię zawierającą zawartość zmiennej ID, wczytuje określone dane (nie wszystkie) z znalezionej linii do zmiennych które potem są importowane do Edit-ów. Nie wiem jak podejść do wyszukania i wczytania okreslonych danych. Zmienna CB nie jest umieszczona w pliku więc nie zwracajcie na nią uwagi, będzie wyliczna na podstawie CN. Struktura wygląda następująco:

struct Formularz{
        char ID[8];
        char NA[20];
        char NP[20];
        char VA[4];
        char CN[8];
        char CB[8];
};

Dane w pliku są zapisane w liniach wyglądających
(X) zaznaczylem dane ktore chce wczytac):

(X)18666GASKET (X)USZCZELKA 11 (X)1512 49 1,1 1 0 50ST (X)6,00

pierwsze liczby sa wlasnie ID ktore chce wyszukac, druga czesc to nazwa ktora chce wczytac do zmiennej NA. (18666 do ID, GASKET do NA)

Do tej pory zrobiłem w funkcji wyszukiwania (podaje to co udało mi się zrobić tak by nie otrzymywać błędu przy kompilacji):

void __fastcall TForm1::Button1Click(TObject *Sender) {
        AnsiString szuk = PobierzNr->Text;
        WyswNr->Text = szuk;
        fstream dload;
        dload.open("dane.txt",ios::in);
        char* ID;
        char* NA;
        char* NP;
        char* VA;
        char* CN;
        char* CB;
        sprintf(ID, "%s", szuk.c_str());
 
 
        dload.close();
}

Mozecie mi pomoc z ogarnięciem tego? Będę wdzięczny za każdą pomoc

Dodałem:

string temp;
getline(dload,temp);

Jednak po wywołaniu zdarzenia wywala mi Access Violation przy getline (bez działało)

0

Skoro nikt nie wie jak to zrobic to trudno, dzieki

0

tak opisałeś swój problem, że w zasadzie nie mam pojęcia o co Ci chodzi. Jeśli każda linia nie ma takiego samego rozmiaru to trzeba wyszukiwać linia po linii. Jeśli struktura, do której będziesz wpisywał te linie wygląda tak jak opisałeś, to może lepiej zapisywać te dane binarnie, dzię czemu będziesz mógł używać fread i fwrite i jeśli ID ma w miarę logiczną kolejność to możliwe, że będzie dało się policzyć offset i od razu odczytać odpowiedni rekord. Jeśli nie możesz wczytać całt plik do mapy ID->dane, dzięki czemu każde wyszukiwanie powinieneś mieć w miarę sensowynym czasie (jeśli program ma wykonać dokładnie jedno czy 2 wyszukiwania w ciągu całego działania programu to ta operacja nie ma sensu.

0

najpierw popraw strukture formularz

struct Formularz{
        int ID;
        char NA[20];
        int liczba; // nie podales, ktore pole jak ma sie nazywac w tej linii
        char liczba2[10]; // tutaj wczytuje jako tekst, bo ktos zamiast kropki jak czlowiek uzyl przecinka
};

mniej więcej tak wczytuje się pierwszy wiersz

FILE* f = fopen("nazwapliku","r");
Formularz a;
fscanf(f,"%d%s %s %*d %d %*d %*d,%*d %*d %*d %*s %s",&a.ID,a.NA,&a.liczba,a.liczba2);
fclose(f);
0

Przepraszam już poprawiłem - dodałem oznaczenia. Dodałe do struktury także

char NP[20];

ID jest wartościa podawaną w oknie i wyszukiwaną w pliku, z linii zawierającej ID pobieram resztę danych

(ID|NA)18666GASKET (NP)USZCZELKA 11 (VA)1512 49 1,1 1 0 50ST (CN)6.00

Czy taka postać wczytywanie będzie poprawna?

fscanf(f,"%d%s %s %*d %d %*d %*d,%*d %*d %*d %*s %s",&a.ID,a.NA,a.NP,&a.VA,a.CN);

jednak gdy wpisuje wyszukany numer Id to komenda

WyswNazwAng->Text = a.NA;

nie powoduje pojawienia sie wartosci dla szukanego ID w Polu WyswNazwAng

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