Программа останавливается без ошибок на fopen - C (СИ)
Формулировка задачи:
Добрый вечер.
Программа останавливается без ошибок или сообщений дебагера на строчке 190.
Помогите разобраться, что не так.
Код написан в С++ Builder
//--------------------------------------------------------------------------- #include <vcl.h> #include <stdio.h> #include <conio.h> #include <alloc.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused //--------------------------------------------------------------------------- #define magazin struct magazin #define products struct products #define address struct address address { char gorod[20]; char ulica[20]; int nomd; }; products { char name[20]; char price[10]; char srok[12]; products *next; }; magazin { int nomer; address adr; products *prod; magazin *next; }; magazin* input(char *namevh,char *namevih) // schitivaem dannie iz faila { FILE *f,*f1; magazin *magaz,*last=NULL,*first=NULL; // magazini, nachalo ocheredi products *prd,*lastprd; // producti, nachalo ocheredi int temp; if ((f=fopen(namevh,"r"))==NULL) { puts("Vhodnoi Fail ne naiden"); getch(); return first; } if ((f1=fopen(namevih,"w"))==NULL) { puts("Vihodnoi Fail ne naiden"); getch(); return first; } if ((fgetc(f))!=-1) { fseek(f,0,0); magaz=(magazin*)malloc(sizeof(magazin)); first=magaz; puts("Ish.dannie:\nNomer, Gorod, Ulica, nomer Doma\n"); while (!feof(f)) { last=magaz; magaz=(magazin*)malloc(sizeof(magazin)); fscanf(f,"%d%s%s%d",&(last->nomer),last->adr.gorod ,last->adr.ulica,&(last->adr.nomd)); fprintf(f1,"%d %s %s %d\n",last->nomer,last->adr.gorod ,last->adr.ulica,last->adr.nomd); printf("%3d, %s, %s, %d\n",last->nomer,last->adr.gorod,last->adr.ulica,last->adr.nomd); last->next=magaz; temp=1; prd=(products*)malloc(sizeof(products)); last->prod= prd; do { lastprd = prd; prd=(products*)malloc(sizeof(products)); fscanf(f,"%s%s%s",lastprd->name ,lastprd->price ,lastprd->srok); fprintf(f1,"%s %s %s\n",lastprd->name ,lastprd->price ,lastprd->srok); if (strcmp(lastprd->name,"-")==0&&strcmp(lastprd->price,"-")==0&&strcmp(lastprd->srok,"-")==0) { if (temp==1) //proverka na nalichie productov last->prod=NULL; temp=0; } else { lastprd->next=prd; temp=2; } } while(temp); } last->next=NULL; } else printf("Fail pust\n"); fclose(f); fclose(f1); puts("------\n"); return first; } magazin* poiskpoproductam(char *namevh,magazin *first) // schitivaem producti iz faila,formiruem spisok magazinov { FILE *f; int variant=0; magazin *magaz,*last=NULL,*pred; // magazini, nachalo ocheredi products *prd,*prd1,*lastprd,*firstprd=NULL,*tp; // producti iz magazina, producti iz faila, dlya zagruzki iz faila, nachalo ocheredi, dlya udaleniya int temp,count=0,countmagaz; last=first; if ((f=fopen(namevh,"r"))==NULL) { puts("Vhodnoi Fail ne naiden"); getch(); return last; } if ((fgetc(f))!=-1) { fseek(f,0,0); prd=(products*)malloc(sizeof(products)); firstprd=prd; while (!feof(f)) { lastprd = prd; prd=(products*)malloc(sizeof(products)); fscanf(f,"%s",lastprd->name); strcpy(lastprd->price,"-"); strcpy(lastprd->srok,"-"); lastprd->next=prd; count++; } lastprd->next=NULL; fclose(f); while (variant<1||variant>2) puts("Polnoe sovpadenie (1) ili chastichnoe (2)? "),scanf("%d",&(variant)); /*Poisk. Poelementno sravnivaem ves' assortiment*/ while (first!=NULL) { prd=first->prod; countmagaz=0; while (prd!=NULL) { prd1=firstprd; while (prd1!=NULL&&strcmp(prd->name,"-")!=0) { if (strcmp(prd->name,prd1->name)==0) countmagaz++; prd1=prd1->next; } prd=prd->next; } if ((variant==1&&count==countmagaz)|| (variant==2&&countmagaz!=0) ) { pred=first; first=first->next; } else { // esli magazin ne sootvetsvuet trebovaniyzm, to srazu udalyaem magaz=first; if (last==first) last=first->next; prd=magaz->prod; while (prd!=NULL) { tp=prd; prd=prd->next; free(tp); } magaz=first; if (pred!=NULL) pred->next=first->next; first=first->next; free(magaz); // osvobozhdenie pamayati pod otrabotannimi dannimi } } } else {printf("Fail pust=Otsutstvie uslovii. Berem VSE\n"); return last;} puts("------\n"); return last; } int output(magazin *first, char *namevih) //zapis' v fail { FILE *f2; magazin *magaz; products *prd,*tp; f2=fopen(namevih,"w"); fputs("-----------------------------------------------\n",f2); puts("Itog:\n"); if (first!=NULL) fputs("Podhodyashih Dannih net",f2); while (first!=NULL) { printf("%3d, %s, %s, %d\n",first->nomer,first->adr.gorod,first->adr.ulica,first->adr.nomd); fprintf(f2,"%d %s %s %d\n",first->nomer,first->adr.gorod ,first->adr.ulica,first->adr.nomd); prd=first->prod; while (prd!=NULL) { if (strcmp(prd->name,"-")!=0) fprintf(f2,"%s %s %s\n",prd->name ,prd->price ,prd->srok); tp=prd; prd=prd->next; free(tp); } magaz=first; first=first->next; free(magaz); // osvobozhdenie pamayati pod otrabotannimi dannimi fputs("- - -\n",f2); } puts("\nDannie zapisani v file!"); fclose(f2); return 0; } void main() { magazin *magaz,*last; // magazini, nachalo ocheredi products *prd,*lastprd; // producti, nachalo ocheredi char namevh[20]; char namevih[20]; puts("Vvedite imya faila s info: ");scanf("%s",namevh); puts("Vvedite imya faila dlya vivoda dannih: ");scanf("%s",namevih); magaz=input(namevh,namevih); // chtenie iz faila if (magaz!=NULL) { puts("Vvedite imya faila s productami: ");scanf("%s",namevh); magaz=poiskpoproductam(namevh,magaz) ; output(magaz,namevih); // vivod dannih v fail } getch(); }
Решение задачи: «Программа останавливается без ошибок на fopen»
textual
Листинг программы
typedef struct{ char gorod[20]; char ulica[20]; int nomd; }address;
Объяснение кода листинга программы
- Типизация структуры данных: структура address состоит из трех полей: gorod (город), ulica (улица) и nomd (номер дома).
- Объявление переменной: адрес переменной address, которая будет использоваться в программе.
- Ввод данных: программа запрашивает у пользователя ввод информации о городе, улице и номере дома.
- Сохранение данных: введенные данные сохраняются в структуре address.
- Вывод данных: программа выводит на экран содержимое структуры address.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д