2012-01-18 55 views
1
#include<stdio.h> 
int main(int argc, char **argv){ 
    FILE *fp = NULL; 
    fp = fopen("D://test.txt","wb"); 
    if(fp == NULL){ 
     printf("Error opening file\n"); 
    } 

    typedef struct{ 
     int a; 
     char b; 
    }A; 

    A x = {12, 'a'}, y = {13, 'b'},z; 
    fwrite(&x, sizeof(A), 1, fp); 
    fwrite(&y, sizeof(A), 1, fp); 

    fseek(fp, sizeof(A), SEEK_SET); 

    fread(&z, sizeof(A), 1, fp); 
    printf("%d %c\n", z.a, z.b); 
    return 0; 
} 

我打算写2个结构到一个文件。然后我需要将文件指针定位到文件中第二个结构的开头,然后从那里执行fread以将第二个结构读入到z中。这些值不能正确读入z。我没有得到问题所在。了解fseek的用法

回答

2

用“wb”打开文件,写入二进制文件。写完之后,您正在尝试读取相同的文件。将模式从“wb”更改为“wb +”:

//fp = fopen("D://test.txt","wb"); 
fp = fopen("D://test.txt","wb+"); 

使其工作。

+0

谢谢。我知道了。 – 2012-01-18 12:41:20

+0

@ajaybidari太棒了,很高兴我能帮上忙。如果您将我的答案标记为已接受的答案,那就太好了。 – Carlito 2012-01-18 12:49:53

1

总是检查每个可能返回错误的调用。在你的情况下,你会看到fread没有正确读取数据。正如Carlito所说,您应该将您的模式参数fopen更改为"wb+"以便能够从文件读取。并且使用perror而不是仅仅使用printf - 因此您将收到一条信息错误消息,并将转至标准错误流,以便在必要时将其从标准输出流中轻松分离。当出现错误时,你也应该打破你的程序流程,而不仅仅是打印错误信息。

您应该自动执行所有这些步骤,始终:检查返回值;看看,究竟发生了什么;更改程序流以处理错误。这是口头禅。 :)