从文件读取时获取结构中的垃圾值

时间:2015-07-22 09:39:52

标签: c linux file parsing struct

我有一个像这样的文本文件

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);

请告诉我哪里出错了

3 个答案:

答案 0 :(得分:2)

喜欢说nemetroid:

  

你正在写一个文字表示(用   你的struct的fptrinf)但是试图读取二进制表示   (带着畏惧)。

例如,假设您要在文件中写入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)。

答案 1 :(得分:0)

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

  1. fflush()
    • 用于刷新文件的缓冲区,如果您对文件执行了写操作,现在要读取,则必须调用此文件
  2. fseek
    • 用于设置文件位置指示器。在您的情况下,文件位置指示符位于文件的末尾。使用fseek()将文件位置设置为开始编写的位置,然后开始阅读。

答案 2 :(得分:0)

fscanf函数对应于fprintf。 fread对应fwrite。这意味着如果要使用fprintf转储结构,请使用fscanf读取它。如果你想使用fread读取结构,那么使用fwrite转储它。参考这些功能的手册应该有所帮助。