【问题标题】:Improper Binary File Read不正确的二进制文件读取
【发布时间】:2019-09-24 16:04:57
【问题描述】:

我是 C 新手,我正在尝试将结构读取和写入 .dat 文件。添加数据时,我会看到 .dat 文件中的字符。但是,我无法读取数据,并且我的代码在每次出现结构时都应该输出“val”时什么也不输出。

我查看了许多来源,但我找不到我的代码与这些来源有何不同。

https://www.geeksforgeeks.org/readwrite-structure-file-c/ 该网站最初用于了解如何执行此操作。

Read/Write to binary files in C 我用它来查看如何修复我的代码,但解决方案没有帮助。

我尝试更改 while 循环中的语句。

struct person
{
    int id;
    char lastName[15];
    char firstName[15];
    char age[4];
};


int main(void) {
  //create new file
  FILE *fp = fopen("file.dat", "wb+");

  struct person a = {10, "Smith", "John", 25};
  fwrite(&a, sizeof(a), 1, fp);

  struct person b = {2, "Ali", "Jon", 12};
  fwrite(&b, sizeof(b), 1, fp);

 struct person c = {19, "Walter", "Martha", 82};
  fwrite(&c, sizeof(c), 1, fp);

  struct person p; 
  while(fread(&p, sizeof(p), 1, fp))
  printf("val");
}

目前,它应该打印 3 个“Vals”,因为 dat 文件中添加了三个人。但是,没有任何东西被打印出来。

感谢您的帮助。

【问题讨论】:

  • 您需要先rewind 文件才能读回(或fseek)。

标签: c


【解决方案1】:

当您完成写入记录时,文件指针(“光标”,您正在读取/写入的位置)位于文件末尾。在尝试从文件中读取之前,您必须使用 rewind()fseek()fsetpos() 将该位置设置回文件的开头。

【讨论】:

    【解决方案2】:

    如果您想回读并打印,请尝试在使用 fpos_tfgetpos() 写入文件之前捕获文件的起始位置。稍后在写入文件后使用fsetpos() 设置回初始位置并使用fget() 读取内容并打印它们。检查修改后的代码如下-

    #include<stdio.h>
    #include<stdlib.h>
    
    struct person
    {
        int id;
        char lastName[15];
        char firstName[15];
        char age[4];
    };
    
    
    int main(void) {
      //create new file
      FILE *fp = fopen("file.dat", "wb+");
      fpos_t position;
    
    
      struct person a = {10, "Smith", "John", "25"};
      fwrite(&a, sizeof(a), 1, fp);
    
      struct person b = {2, "Ali", "Jon", "12"};
      fwrite(&b, sizeof(b), 1, fp);
    
      struct person c = {19, "Walter", "Martha", "82"};
      fwrite(&c, sizeof(c), 1, fp);
    
      fseek(fp, 0, SEEK_SET);
    
      struct person p; 
      while(fread((void *)&p, sizeof(p),1,fp)==1)
      {
        printf("%d\n",p.id);
        printf("%s\n",p.lastName);
        printf("%s\n",p.firstName);
        printf("%s\n",p.age);    
        printf("\n");
      }
    }
    

    【讨论】:

    • 您的答案中有一些拼写错误,并且开头的描述与您的代码不匹配。另外,你为什么建议你的代码用fgetc()逐字符读取二进制文件?
    • @Swordfish。谢谢,纠正错别字。代码与描述同步——首先,使用fpos_tfgetpos() 获取起始位置,然后在阅读之前使用fsetpos() 将位置设置为初始位置,截至目前已在语法上修改了语句以便更好地理解。关于fgetc()是读取文件的一种方式,使用有什么问题或风险吗?
    • 关于fgetc()它是读取文件的一种方式,使用它有什么问题或风险吗? – 风险?不,但我敢打赌 apaul30 想要他的结构而不是字符。并且由于结构包含 char 数组,因此写入文件的数据中也很有可能存在字符串,但当字符串不具有数组的确切长度时,字符串后面也会出现垃圾。
    • 好的,知道了。谢谢。
    • 感谢@Swordfish 修改代码删除fgetc()
    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多