【问题标题】:Stuck At project in c卡在c中的项目
【发布时间】:2016-03-03 00:29:39
【问题描述】:

大家好,所以我必须为我的编程课做一个项目,如果代码已经存在,我必须创建一个包含旅行代码及其目的地的文件,我必须用新信息更新它。我尝试这样做,但由于某种原因,我的程序在一段时间结束时不断崩溃。

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
    int patente;
    float fecha;
    char dest[40];
    int cant;
}viajes;

FILE * abrir();
void main(void)
{
FILE * pf;
pf=abrir();
viajes viajes,vaux;

    printf("Ingrese Numero de patete: ");
    scanf("%d",&viajes.patente);
    fflush(stdin);
    while (viajes.patente!=0)
    {
        printf("Ingrese Fecha: ");
        scanf("%f",&viajes.fecha);
        fflush(stdin);
        printf("Destino: ");
        gets(viajes.dest);
        fflush(stdin);
        fseek(pf,0L,SEEK_END);
            if ( ftell(pf) == 0 )
            {
            viajes.cant=1;
            fwrite(&viajes,sizeof(viajes),1,pf);
            }
            else
            {
                fseek(pf,0L,SEEK_SET);
                fread(&vaux,sizeof(viajes),1,pf);
                while(!feof(pf)&&vaux.patente!=viajes.patente)
                {
                    fread(&vaux,sizeof(viajes),1,pf);
                if(feof(pf))
                {
                    viajes.cant=1;
                    fwrite(&viajes,sizeof(viajes),1,pf);
                }
                else
                {
                    fseek(pf,(-1L)*sizeof(viajes),SEEK_CUR);
                    vaux.cant++;
                    strcpy(vaux.dest,viajes.dest);
                    vaux.fecha=viajes.fecha;
                    fwrite(&vaux,sizeof(viajes),1,pf);
                }
                }

            }

    printf("Ingrese Numero de patete: ");
    scanf("%d",&viajes.patente);
    fflush(stdin);
    }
    fseek(pf,0,SEEK_SET);
    fread(&viajes,sizeof(viajes),1,pf);//lee un registro
    puts("Patente \t Fecha \t Destino \t Viajes");
    while(!feof(pf))
        {
            fread(&viajes,sizeof(viajes),1,pf);
            printf("\n%d \t %f \t %s \t %d",viajes.patente,viajes.fecha,viajes.dest,viajes.cant);
        }
    fclose(pf);
}

FILE * abrir(void)
{

    FILE * pf;
    pf = fopen("infcamion.jp","r+b");
    if(pf==NULL)
    {
        pf= fopen("infocamion.jp","w+b");
        if(pf==NULL)
        {
            perror("infocl.jp");
            exit(1);
        }

    }
    return pf;
}

编辑:我发布了完整的代码,我可以在没有警告或错误的情况下编译它,程序在我提供的第二批信息上崩溃

【问题讨论】:

  • fflush(stdin); 调用未定义的行为。不要使用它。
  • gets() 有不可避免的缓冲区溢出风险。你不应该使用它。
  • scanf("%d",viajes.patente); 调用 未定义的行为 以传递具有错误类型的数据。
  • 您不会显示所有外部 while 循环。如果这是崩溃的循环,请添加其余代码。
  • 无需使用feof() 函数来控制fread() 循环(即使正确实施)。方法是检查来自fread 的返回值。当它是0 时,您已经阅读了所有文件。 while((itemsread = fread(...)) != 0) {...}

标签: c file structure


【解决方案1】:

问题可能是scanf("%d",viajes.patente);。您需要将指针传递给scanf,而不是整数。确保您在编译代码时启用了所有警告,并且您的编译器应该标记这样的内容。

【讨论】:

  • 哦,是的,我修复了它,但仍然崩溃
猜你喜欢
  • 2020-03-02
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2018-04-06
  • 2016-04-03
相关资源
最近更新 更多