了解fseek的用法

时间:2012-01-18 12:27:31

标签: c file-io fseek

#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。我无法解决问题所在。

2 个答案:

答案 0 :(得分:3)

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

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

让它发挥作用。

答案 1 :(得分:2)

始终检查每个可能返回错误的电话。在您的情况下,您会看到fread无法正确读取数据。正如Carlito所说,您应该将fopen的模式参数更改为"wb+",以便能够从文件中读取。并且使用perror而不仅仅是printf - 因此您将获得信息性错误消息,并且它将转到标准错误流,因此如果需要,可以很容易地将其与标准输出流分开。此外,您应该在发生错误时中断程序流程,而不仅仅是打印错误消息。

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