pawelski utworzono 7 lutego 2010 utworzono 7 lutego 2010 Hi! Mam taki oto kod: [code] #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct kontakt{ char imie[16]; char nazwisko[16]; }kontakt; /* * */ int kontakt_zapisz(); int kontakt_usun(); int kontakt_wyswietl(); int main(int argc, char** argv) { // kontakt_zapisz(); kontakt_wyswietl(); return (EXIT_SUCCESS); } int kontakt_wyswietl(){ FILE *plik; kontakt *kontakty=(kontakt *)malloc(sizeof(struct kontakt)); int ile=0; if(!(plik=fopen("kontakty.dat","r"))){ perror("Nie mozna otworzyc kontakty.dat"); return 1; } while(fread(kontakty,sizeof(struct kontakt),1,plik)==1){ ile+=1; realloc(kontakty,sizeof(struct kontakt)*(ile+1)); printf("Ile: %i, Kontaktow:%i",ile,sizeof(kontakty)); printf("%i",sizeof(kontakty)); // printf("Imie: %s, Nazwisko:%s\n",kontakty[ile].imie,kontakty[ile].nazwisko); } free(kontakty); fclose(plik); } int kontakt_zapisz(){ FILE *plik; kontakt nowy; plik=fopen("kontakty.dat","a+"); char imie[16]; char nazwisko[16]; printf("Podaj imie i nazwisko:\n"); scanf("%s%s",imie,nazwisko); strcpy(nowy.imie,imie); strcpy(nowy.nazwisko,nazwisko); if(!(fwrite(&nowy,sizeof(struct kontakt),1,plik))){ perror("Nie udalo sie dopisac!"); } else{ printf("Dopisano pomyslnie"); } fclose(plik); }[/code] Do pliku kontakty.dat wczesniej zapisalem 3 pozycje, debugger z netbeans pokazuje ze zostaje wczutana tylko jedna pozycja z pliku, po pierwszym przebiegu petli w linii "while(fread(kontakty,sizeof(struct kontakt),1,plik)==1){" rzuca segfaultem.. Nie mam juz do tego sił.. Co zrobiłem źle?
rafalluz komentarz 7 lutego 2010 komentarz 7 lutego 2010 Zarzuć jeszcze plik, który wczytujesz, spróbujemy zreplikować.
pawelski komentarz 7 lutego 2010 Autor komentarz 7 lutego 2010 Uruchomiłem 2 razy program z odkomentowana funkcja kontakty_zapisz, zreszta poradziłem sobie już tak: [code] int kontakt_wyswietl(){ FILE *plik; kontakt *kontakty=(kontakt *)malloc(sizeof(struct kontakt)); kontakt *temp; int ile=0; if(!(plik=fopen("kontakty.dat","r"))){ perror("Nie mozna otworzyc kontakty.dat"); return 1; } while(fread(&kontakty[ile],sizeof(struct kontakt),1,plik)==1){ ile+=1; temp=(kontakt* )realloc(kontakty,sizeof(struct kontakt)*(ile+1)); kontakty=temp; printf("Imie: %s, Nazwisko:%s\n",kontakty[ile-1].imie,kontakty[ile-1].nazwisko); } free(kontakty); fclose(plik); return 0; }[/code] Bez electric fance i gdb bym sobie nie poradził.. Mały offtop: Znacie jakieś jeszcze narzędzia ułatwiające pisanie w c?
Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!
Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.