понимание использования fseek - PullRequest
2 голосов
/ 18 января 2012
#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 должным образом.Я не понимаю, в чем проблема.

Ответы [ 2 ]

3 голосов
/ 18 января 2012

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

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

, чтобы он работал.

2 голосов
/ 18 января 2012

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

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

...