Программа останавливается без ошибок на 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.