【问题标题】:How do I read a binary file of n record using c如何使用c读取n记录的二进制文件
【发布时间】:2021-12-20 02:27:18
【问题描述】:

我有一个将 n 条配置文件记录写入二进制文件的代码,但是当我尝试从中读取并在控制台上打印时,它不起作用并进入无限循环,这是我的代码:

/*profile strucre */
struct profile 
{
  char name[30];
  int phoneNumber;
} pr;


int main()
{
   int rn; 
   FILE *fp; //le fichier
   printf("\nHow many profiles would you like to have?");
   scanf("%d", &rn);
   struct profile p[rn];
   for (int i = 0; i < rn; i++)
 {
 printf("\nEnter the name no %d: ", i+1);
 scanf("%s", p[i].name);
 printf("\nEnter the name phone number %d: ", i+1);
 scanf("%d", &p[i].phoneNumber);
 }

 //file creation 
 for (int i = 0; i < rn; i++)
 {
  fp = fopen ("profiles.bin", "wb");
  if (fp != NULL)
  {
    fwrite (&p[i], sizeof (p[i]), 1, fp);
    fclose (fp);
  }
 }

/* file reading */
    if(fp==NULL) //if the file doesnt existe
    {
        printf("File could not open");
        exit(0); //EXIT SUCCESS
    }
    int j = 1;
    while((fread(&pr,sizeof(pr),1,fp)!= EOF)) //this doesnt work
    {
      printf("\nRecord No:%d",j);
      printf("\n------------------");
      printf("\nName:%s",pr.name);
      printf("\nPhone number:%d",pr.phoneNumber);
      printf("\n=======================");
      j++;
    }
    fclose(fp);
    
}

输出是:

=======================
Record No:3728
------------------
Name:
Phone number:0
=======================
Record No:3729
------------------
Name:
Phone number:0
=======================
Record No:3730
------------------
Name:
Phone number:0
=======================
Record No:3731
------------------
Name:
Phone number:0
=======================
Record No:3732
------------------
Name:
Phone number:0
=======================
Record No:3733
------------------
Name:
Phone number:0
=======================
Record No:3734
------------------
Name:
Phone number:0
=======================
Record No:3735
------------------
Name:
Phone number:0
=======================
Record No:3736
------------------
Name:
Phone number:0
=======================
Record No:3737
------------------
Name:
Phone number:0
=======================
Record No:3738
------------------
Name:
Phone number:0
=======================
Record No:3739
------------------
Name:
Phone number:0
=======================
Record No:3740
------------------
Name:
Phone number:0
=======================
Record No:3741
------------------
Name:
Phone number:0
=======================
Record No:3742
------------------
Name:
Phone number:0
=======================
Record No:3743
------------------
Name:
Phone number:0
=======================
Record No:3744
------------------
Name:
Phone number:0
=======================
Record No:3745
------------------
Name:
Phone number:0
=======================
Record No:3746
------------------
Name:
Phone number:0
=======================
Record No:3747
------------------
Name:
Phone number:0
=======================
Record No:3748
------------------
Name:
Phone number:0
=======================
Record No:3749
------------------
Name:
Phone number:0
=======================
Record No:3750
------------------
Name:
Phone number:0
=======================
Record No:3751
------------------
Name:
Phone number:0
=======================
Record No:3752
------------------
Name:
Phone number:0
=======================
Record No:3753
------------------
Name:
Phone number:0
=======================
Record No:3754
------------------
Name:
Phone number:0

【问题讨论】:

  • 寻求调试帮助的问题必须提供完整的代码minimal reproducible example。请使用完整的代码更新问题,任何人都可以完全按照所示运行以重现问题。
  • 不要省略重要的代码,例如您如何打开文件以及如何检查错误。
  • 文件创建错误,因为每次迭代都会打开和关闭文件。这意味着它每次都会覆盖文件的开头。那么读取也是错误的,因为它没有打开文件。
  • 查看fread() 的手册页。可以返回EOF 吗?

标签: c file binaryfiles


【解决方案1】:
  fp = fopen ("profiles.bin", "wb");
  if (fp != NULL)
  {
    fwrite (&p[i], sizeof (p[i]), 1, fp);
    fclose (fp);
  }

您每次都关闭并覆盖您的文件。所以你那里只有一条记录。

您需要将关闭移出循环。

  fp = fopen ("profiles.bin", "wb");
  if (fp != NULL)
  {
    fwrite (&p[i], sizeof (p[i]), 1, fp); 
    // add some error checking
  }
  fclose (fp);

您还需要打开文件进行阅读(因为它已关闭)

  fp = fopen ("profiles.bin", "rb");
/* file reading */
    if(fp==NULL) //if the file doesnt exist

【讨论】:

  • 我现在得到一个输出,但它只是最后一条记录,它仍在无限循环中
猜你喜欢
  • 1970-01-01
  • 2017-01-25
  • 2011-02-03
  • 2017-10-01
  • 2011-09-03
  • 2016-01-15
  • 1970-01-01
  • 2016-10-21
  • 2015-08-22
相关资源
最近更新 更多