Изменение данных .bin файла в C - PullRequest
3 голосов
/ 02 февраля 2010

У меня есть много данных, хранящихся в формате бина как последовательность структур. Я хочу иметь возможность произвольно читать любую из структур и изменять ее в C. Я пытаюсь использовать следующий код, но он не работает. Может кто-нибудь исправить это для меня, пожалуйста?

Кроме того, возможно ли удалить промежуточную структуру из промежуточного файла?

Код ниже:

#include <stdio.h>
#include <stdlib.h>

struct rec {
        int x,y,z;
};

void f_rite()
{
        int i;
        FILE *ptr_myfile;
        struct rec my_record;

        ptr_myfile=fopen("test.bin","w");

        for ( i=0; i < 5; i++ ) {
                my_record.x = i;
                fwrite( &my_record, sizeof(struct rec), 1, ptr_myfile );
        }

        fclose(ptr_myfile);

        return;
}


void f_read()
{
        int i;
        FILE *ptr_myfile;
        struct rec my_record;

        ptr_myfile=fopen("test.bin","r");

        for ( i=1; i <= 5; i++) {
                fread(&my_record,sizeof(struct rec),1,ptr_myfile);
                printf("%d\n",my_record.x);
        }
        printf("\n");

        fclose(ptr_myfile);

        return;
}

void f_rerite()
{
        int i;
        FILE *ptr_myfile;
        struct rec my_record;

        ptr_myfile=fopen("test.bin","rw");

        for ( i=5; i >= 0; i-- ) {
                fseek( ptr_myfile, sizeof(struct rec)*i, SEEK_SET );
                fread( &my_record, sizeof(struct rec), 1, ptr_myfile );
                my_record.x = my_record.x + 100;
                fwrite( &my_record, sizeof(struct rec), 1, ptr_myfile );
        }

        fclose(ptr_myfile);

        return;
}

int main()
{
        f_rite();
        f_read();
        f_rerite();
        f_read();

        return 0;
}

Ответы [ 2 ]

3 голосов
/ 02 февраля 2010

Нет флага "rw" для открытия.Вам нужно "r +" для чтения и записи (обновления).Поскольку это двоичные данные, вы должны использовать «r + b» и «wb» в вашей функции f_rite и «rb» в вашей функции f_read.Также:

  • Проверьте возвращаемое значение вызовов, которые могут быть неудачными, вы обнаружите, что, например, fwrite fail.
  • Ваши функции f_rerite итерируют по 6 элементам, вы отключены на один.
  • Ваш f_rerite также пишет в следующий элемент.Скорее всего, вы хотите обновить текущую запись.Что означает, что вам нужно снова искать fseek после вызова fread.
2 голосов
/ 02 февраля 2010

"rw" неверно. Используйте "r+". Не забывайте искать после прочтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...