【发布时间】: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) {...}