Ĺadny brzuch
Mam do pliku zapisana strukture danych. Nastepnie w programie ja otwieram i chciałbym zmienic wartosc jednego z pięciu pól składowych tej struktury. Jak to zrobić?
Użytkownik WojtekP edytował ten post 06 styczeń 2007, 23:45
Wrzucasz do pamięci strukturę, w której chcesz zmienić pole. Zmieniasz to pole. I wrzucasz z powrotem do pliku (wskaźnik pliku - sizeof(struktura), czyli nadpisujesz stare dane nowymi).
Użytkownik Ku.ririn edytował ten post 07 styczeń 2007, 01:23
Wrzucasz do pamięci strukturę, w której chcesz zmienić pole. Zmieniasz to pole. I wrzucasz z powrotem do pliku (wskaźnik pliku - sizeof(struktura), czyli nadpisujesz stare dane nowymi).
Mam taki kod funkcji na zamiane danych:
int i; clrscr(); cout<<"Podaj identyfikator towaru: "; cin>>i; clrscr(); plik=fopen(nazwa,"a+"); cout<<"Dotychczasowe dane:"<<endl<<endl; while(fread(&towar,sizeof(towar),1,plik)==1) if(i==towar.id) { cout<<endl<<endl; cout<<"Identyfikator: "<<towar.id<<endl; cout<<"Nazwa: "<<towar.nazwa<<endl; cout<<"Jednostka miary: "<<towar.jednostka<<endl; cout<<"Cena za sztuke: "<<towar.cena<<endl; cout<<"Ilosc sztuk: "<<towar.ile<<endl; cout<<"Wartosc: "<<towar.wartosc<<endl<<endl; } //Tutaj ma się podawać nowe dane do zapisu cout<<"Podaj identyfikator: "; cin>>towar.id; puts("\nPodaj nazwe towaru: "); //gets(wiersz);towar.nazwa=atoi(wiersz); gets(towar.nazwa); puts("\nPodaj jednostke miary: "); //gets(wiersz);towar.jednostka=atoi(wiersz); gets(towar.jednostka); cout<<endl<<"Podaj cene jednostkowa: "; cin>>towar.cena; cout<<endl<<"Podaj ilosc: "; cin>>towar.ile; towar.wartosc=(towar.cena)*(towar.ile); fwrite(&towar,sizeof(towar),1,plik); getch(); fclose(plik); start();
Tyle tylko, że nie zamienia danych a dopisuje je na końcu pliku. Jak mam zmienic kod?
Użytkownik WojtekP edytował ten post 07 styczeń 2007, 13:48
Dopisuje dane na końcu pliku, ponieważ ustawiłeś atrybut a+, powinien być r+. i za pomocą fseek musisz się cofnąć o sizeof(struktura) i potem zapisać.
fseek ustawiasz oczywiście w miejscu gdzie zamierzasz nadpisaywać dane (na przykład od bajtu numer 45) aż do momentu zapisania nowych danych. Jeśli w pliku masz 80 bajtów, a będziesz nadpisywał od 45 do 60, to te pozostałe dwadzieścia pozostanie bez zmian, żebyś się nie zdziwił, ale to chyba jasne :)
Dzięki wszystkim za pomoc. Już sobie poradziłem z problemem. Temat można zamknąć.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Użytkownik WojtekP edytował ten post 06 styczeń 2007, 23:45
Wrzucasz do pamięci strukturę, w której chcesz zmienić pole. Zmieniasz to pole. I wrzucasz z powrotem do pliku (wskaźnik pliku - sizeof(struktura), czyli nadpisujesz stare dane nowymi).
Użytkownik Ku.ririn edytował ten post 07 styczeń 2007, 01:23
Wrzucasz do pamięci strukturę, w której chcesz zmienić pole. Zmieniasz to pole. I wrzucasz z powrotem do pliku (wskaźnik pliku - sizeof(struktura), czyli nadpisujesz stare dane nowymi).
Mam taki kod funkcji na zamiane danych:
int i; clrscr(); cout<<"Podaj identyfikator towaru: "; cin>>i; clrscr(); plik=fopen(nazwa,"a+"); cout<<"Dotychczasowe dane:"<<endl<<endl; while(fread(&towar,sizeof(towar),1,plik)==1) if(i==towar.id) { cout<<endl<<endl; cout<<"Identyfikator: "<<towar.id<<endl; cout<<"Nazwa: "<<towar.nazwa<<endl; cout<<"Jednostka miary: "<<towar.jednostka<<endl; cout<<"Cena za sztuke: "<<towar.cena<<endl; cout<<"Ilosc sztuk: "<<towar.ile<<endl; cout<<"Wartosc: "<<towar.wartosc<<endl<<endl; } //Tutaj ma się podawać nowe dane do zapisu cout<<"Podaj identyfikator: "; cin>>towar.id; puts("\nPodaj nazwe towaru: "); //gets(wiersz);towar.nazwa=atoi(wiersz); gets(towar.nazwa); puts("\nPodaj jednostke miary: "); //gets(wiersz);towar.jednostka=atoi(wiersz); gets(towar.jednostka); cout<<endl<<"Podaj cene jednostkowa: "; cin>>towar.cena; cout<<endl<<"Podaj ilosc: "; cin>>towar.ile; towar.wartosc=(towar.cena)*(towar.ile); fwrite(&towar,sizeof(towar),1,plik); getch(); fclose(plik); start();
Tyle tylko, że nie zamienia danych a dopisuje je na końcu pliku. Jak mam zmienic kod?
Użytkownik WojtekP edytował ten post 07 styczeń 2007, 13:48
Dopisuje dane na końcu pliku, ponieważ ustawiłeś atrybut a+, powinien być r+. i za pomocą fseek musisz się cofnąć o sizeof(struktura) i potem zapisać.
fseek ustawiasz oczywiście w miejscu gdzie zamierzasz nadpisaywać dane (na przykład od bajtu numer 45) aż do momentu zapisania nowych danych. Jeśli w pliku masz 80 bajtów, a będziesz nadpisywał od 45 do 60, to te pozostałe dwadzieścia pozostanie bez zmian, żebyś się nie zdziwił, ale to chyba jasne :)
Dzięki wszystkim za pomoc. Już sobie poradziłem z problemem. Temat można zamknąć.