понимание использования 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 структуры в файл. Затем мне нужно поместить указатель файла в начало 2-й структуры в файле, а затем выполнить fread оттуда, чтобы прочитать 2-ю структуру в z. Значения не считываются в z должным образом. Я не понимаю, где проблема.


person ajay bidari    schedule 18.01.2012    source источник


Ответы (2)


Вы открыли файл с помощью «wb», напишите двоичный файл. После записи вы пытаетесь прочитать тот же файл. Измените режим с "wb" на "wb+":

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

чтобы заставить его работать.

person Carlito    schedule 18.01.2012
comment
@ajaybidari Отлично, рад, что смог помочь. Хотел бы, чтобы вы отметили мой ответ как принятый ответ. - person Carlito; 18.01.2012

Всегда проверяйте каждый вызов, который может вернуть ошибку. В вашем случае вы увидите, что fread не читает данные должным образом. Как сказал Карлито, вы должны изменить параметр режима fopen на "wb+", чтобы иметь возможность читать из файла. И используйте perror вместо просто printf - так вы получите информативные сообщения об ошибках, и они перейдут в стандартный поток ошибок, поэтому при необходимости его можно будет легко отделить от стандартного потока вывода. Также вы должны прерывать поток программы при возникновении ошибки, а не просто печатать сообщение об ошибке.

Вы всегда должны делать все эти шаги автоматически: проверять возвращаемые значения; проверить, что именно произошло; изменить поток программы для обработки ошибки. Это мантра. :)

person praetorian droid    schedule 18.01.2012