我想读取一个structs文件,但它读取不正确


#include <stdio.h>
#include <conio.h> 
#include <stdlib.h>
#include <time.h>
typedef struct 
{
int Id_provincia;
struct fec{
int dd;
int mm;
int aa;
}Fecha;
char Tipo_alerta;
}incendio;

int main(){
int Num;
FILE *archivo;
archivo = fopen("Incendios_carga.dat", "rb");
if (archivo == NULL){
exit(1);
}
incendio foco;
fread(&foco, sizeof(incendio), 1, archivo);
while(!feof(archivo)){
printf("el ID_Proviconcia es: : %d n",foco.Id_provincia);
fread(&foco, sizeof(incendio), 1, archivo);
Num++;
}
printf("la cantidad de regs son:%d",Num);
fclose(archivo);
}

这个程序应该在屏幕上显示22的Id_Provice,但它没有这样做,它显示随机数,我不知道为什么。我打开的文件来自另一个程序,我用它将信息加载到文件中,用这个程序处理它

您的主要问题是没有将Num初始化为零,因此您的计数起点不确定(准随机(。

您也有不必要的include,不必要地使用feof(),并且因此有不必要地代码重复。(另请参阅问题评论中的讨论。(

你的代码应该更像这样:

#include <stdio.h>
#include <stdlib.h>
typedef struct 
{
int Id_provincia;
struct fec
{
int dd;
int mm;
int aa;
} Fecha;
char Tipo_alerta;
} incendio;
int main(void)
{
const char filename[] = "Incendios_carga.dat";
FILE *archivo = fopen(filename, "rb");
if (archivo == NULL)
{
fprintf(stderr, "failed to open file '%s' for readingn", filename);
exit(1);
}
incendio foco;
int Num = 0;
while (fread(&foco, sizeof(foco), 1, archive) == 1)
{
printf("el ID_Proviconcia es: %dn", foco.Id_provincia);
Num++;
}
printf("la cantidad de regs son: %dn", Num);
fclose(archive);
return 0;
}

支架的放置是主观的——你可以使用1TBS,但我更喜欢Allman。只要保持一致(您几乎完全一致——typedef之后的{在错误的行上,表示100%一致性(。

打印带有尾随换行符的邮件。在stderr而不是stdout上打印错误。避免在出现错误时以静默方式退出程序。报告无法打开的文件的名称。这通常意味着";使用变量(或#define(来保存文件名,这样您就可以将其传递给fopen()fprintf()";。IMO,调用fopen()或任何其他文件打开函数时使用文件名的字符串文字很少是正确的,因为您需要在错误消息中重复该字符串。由于您在循环之前定义了变量foco,所以我也将Num的定义移到了那里,将其初始化为零。我更喜欢用return 0;来完成程序,尽管C99说没有必要。(我认为这是标准中的一个错误,但这样做是为了符合C++98。我只是不使用(错误(功能。(

最新更新