繁体   English   中英

如何使用c读取n条记录的二进制文件

[英]How do I read a binary file of n record using c

我有一个代码将 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
  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM