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

Объяснение кода листинга программы

  1. Типизация структуры данных: структура address состоит из трех полей: gorod (город), ulica (улица) и nomd (номер дома).
  2. Объявление переменной: адрес переменной address, которая будет использоваться в программе.
  3. Ввод данных: программа запрашивает у пользователя ввод информации о городе, улице и номере дома.
  4. Сохранение данных: введенные данные сохраняются в структуре address.
  5. Вывод данных: программа выводит на экран содержимое структуры address.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.444 из 5
Похожие ответы