ďťż

Ładny brzuch

Mam taki problem, którego w ogóle nie mogę zidentyfikować w kodzie. Zadanie polegało na tym, aby:
1. Wczytać dane kilku osób (imię i nazwisko), a następnie zapisać je do pliku
2. Otworzyć ten plik, pobrać dane i zapisać je do listy w kolejności rosnącej (sortowanie względem nazwiska). tylko należy te dane od razu w odpowiednim miejscu do listy wstawić.
3. Usunąć listę, poczynając od pierwszego elementu. Za każdym razem lista ma być wyświetlona.
W Visual Studio 2008 program się wykonywał, kompilator żadnego błędu nie wykrył. Natomiast podczas wykonywania pojawiał się jakiś dziwny błąd. Program działał tak, że wstawiał elementy do listy, ale czasami pokazywał jakiś element dwa razy (przy jednych danych element się powtarzał na początku, przy innych na końcu, jeszcze przy innych w środku - nie zdążyłam zauważyć zależności, kiedy co powtarza). Zaraz potem pojawiało się okienko (chyba z wykrzyknikiem w białym/niebieskim trójkącie, nie pamiętam). Taki problem miałam nie tylko ja, ale też i inne osoby, które taki program utworzyły.
W Dev-C++ 4.9.9.2 program w ogóle nie chce się uruchomić, Windows od razu pokazuje, że program przestał działać.
Listing wygląda tak:
#include <conio.h> #include <stdlib.h> #include <stdio.h> #include <string.h> //#define N 5; struct osoba { char imie[20]; char nazwisko[25]; }; struct lista { char im[20]; char naz[25]; struct lista *next; }; struct lista *wstaw(struct lista *head, struct osoba os) { struct lista *nowy, *temp; nowy=(struct lista *)malloc(sizeof(struct lista)); strcpy(nowy->im,os.imie); strcpy(nowy->naz,os.nazwisko); nowy->next=NULL; if(head==NULL) head=nowy; else { if (strcmp(head->naz, nowy->naz)>0) { nowy->next=head; head=nowy; } else {temp=head; while(temp->next!=NULL&& strcmp(temp->next->naz,nowy->naz)<0) temp=temp->next; nowy->next=temp->next; temp->next=nowy; } } return (head); } void pokaz(struct lista *head) { while(head->next!=NULL) { printf("%s\n", head->naz); printf("%s\n\n", head->im); head=head->next; } } struct lista *usun(struct lista *head) { struct lista *temp; if(head!=NULL) temp=head; if(head->next==NULL) { free(head); head=NULL; return NULL; } head=head->next; free(temp); return (head); } int main() { int i, j; struct osoba os; struct lista *head=NULL; FILE *fp; if((fp=fopen("dane.txt", "w"))==NULL) { printf("blad. exit"); exit(1); } for(i=0; i<5; i++) { for(j=0; j<20; j++) os.imie[j]='\0'; for(j=0; j<25; j++) os.nazwisko[j]='\0'; printf("podaj imie: "); gets(os.imie); printf("podaj nazwisko: "); gets(os.nazwisko); fwrite(&os, sizeof(struct osoba), 1, fp); } if((fp=fopen("dane.txt", "r"))==NULL) { printf("blad. exit"); exit(1); } rewind(fp); while(!feof(fp)) { fread(&os, sizeof(struct osoba), 1, fp); head=wstaw(head, os); } pokaz(head); /* koniec tworzenia listy */ while(head!=NULL) { head=usun(head); pokaz(head); printf("------------------------------\n\n"); } fclose(fp); /* koniec odczytu pliku */ system("pause"); return 0; }
W VS 2008 main jest jako void main(), bez return 0 na końcu programu. Listing jest poprawiony, aby działał pod Dev'a (czyli jest int main())



1. Akura int main() { return 0; } jest całkowicie poprawnym zapisem.

2. Jeśli otwierasz plik, to nie zapominaj go zamknąć ;) Inaczej nie zapiszesz niczego do pliku. A z tego wynika, że nawet nie zajrzałaś do tworzonego pliku, żeby sprawdzić czy coś się w nim zapisuje.

3. Popraw ten błąd i zobacz jak działa program. Zobaczysz, że zapisze dane do pliku, wczyta je i wyświetli.

4. Błąd jest w czytaniu, bo dodałem dwie osoby, a wczytało 3 ;)

5. Błąd jest w wyświetlaniu, w tej linii: "while(head->next!=NULL)". Co się stanie, jeżeli na liście nie ma elementów i head jest NULL?
Użytkownik Kozack edytował ten post 16 grudzień 2009, 22:03

1. Akura int main() { return 0; } jest całkowicie poprawnym zapisem.
Wiem wieeem, po prostu tak to dałam do informacji, bo co kompilator, to inaczej maina się wpisuje ;)

2. Jeśli otwierasz plik, to nie zapominaj go zamknąć wink2.gif Inaczej nie zapiszesz niczego do pliku. A z tego wynika, że nawet nie zajrzałeś do tworzonego pliku, żeby sprawdzić czy coś się w nim zapisuje.
Racja... Na początku miałam tak w programie, potem ktoś mi pokasował część ze wczytywaniem pliku i jak pisałam to od początku, to zapomniałam dać zamknięcie pliku.

A resztę rozpracuję, byle nie dzisiaj :) Ale dziękuję bardzo za te cenne wskazówki :)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •