【问题标题】:Getting garbage value in structure when reading from file从文件读取时在结构中获取垃圾值
【发布时间】:2015-07-22 09:39:51
【问题描述】:

我有一个这样的文本文件

987jgkfl
12358ldjkdju
7579jngj
8uuujkl
09698fjfj

我有这样的结构

struct emprec

{

    int empid;
    int todo;
    char name[20];

};

我把结构体的值写到这样的文件中

fd = fopen("/home/tarun/Desktop/test34.txt","a+");
    fprintf(fd,"%d",temp2.empid);
    fprintf(fd,"%s",temp2.name);
    count++;
    fclose(fd);

但是当我从文件中读取时,我得到了垃圾值

while(i<=count)
{
fread(&temp5,sizeof(temp5),1,fd);
//fscanf(fd,"%d,%s",&temp5.empid,temp5.name);
//int k = strlen(temp5.name);
//printf("Value of k is %d\n",k);
//temp5.name[7]= '\0';
//fread(&temp5.empid,sizeof(temp5.empid),1,fd);
//fread(temp5.name,20,1,fd);
printf("\n%d %s",temp5.empid,temp5.name);
i++;
}
fclose(fd);

请告诉我哪里出错了

【问题讨论】:

  • 尝试格式化阅读...比如fscanf()
  • 另外,第一个文件的目的是什么?
  • @SouravGhosh 第一个文件是我必须从中读取值的文本文件。并且还尝试了 fscanf 但没有得到确切的输出
  • 我不确定,但在fread 之前可能需要rewind(fp);
  • 您正在编写结构的文本表示(使用 fptrinf),但尝试读取二进制表示(使用 fread)。

标签: c linux file parsing struct


【解决方案1】:

就像说nemetroid:

您正在编写文本表示(使用 fptrinf) 的结构,但试图读取二进制表示 (带 fread)。

例如,假设您想在文件中写入一个 int。通过这样做:

   fd = fopen("file","a+");
   fprintf(fd,"%d",42);

您将编写字符“4”和字符“2”。在 ASCII 中,“4”是 0x34,“2”是 0x32。 如果您想读取该文件并尝试将其放入 4 字节整数中,请执行以下操作:

int a = 0;
fread(&a,sizeof(a),1,fd);

变量“a”将包含文件中的数据:

a = 0x00003234

而不是您期望的 42 (0x0000002a)。

【讨论】:

  • 是的,我说 a = 0x3442 而不是 0x3432 会出错(我忘记了字节顺序)。使用 GDB 一步一步告诉我 a=0x3234。
  • 很好,使用调试器。
【解决方案2】:

您的代码中缺少一些调用:

  1. fflush()
    • 用于刷新文件的缓冲区,如果你对文件执行了写操作,现在你想读,则必须调用它
  2. fseek
    • 用于设置文件位置指示器。在您的情况下,文件位置指示器位于文件末尾。使用fseek() 将文件位置设置为您开始写入而不是开始读取的位置。

【讨论】:

    【解决方案3】:

    fscanf 函数对应于 fprintf。 fread 对应于 fwrite。这意味着如果你想使用 fprintf 转储结构,然后使用 fscanf 读取它。如果你想使用 fread 读取结构然后使用 fwrite 转储它。参考这些函数的手册页应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 2016-06-17
      • 2011-06-26
      相关资源
      最近更新 更多