在C中更改.bin文件的数据

时间:2010-02-02 16:28:51

标签: c file struct binary

我有很多数据以bin格式存储为一系列结构。我希望能够随机读取任何结构并在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 个答案:

答案 0 :(得分:3)

fopen没有“rw”标志。你需要“r +”进行读写(更新)。因为它是二进制数据,所以你应该在f_rite函数中使用“r + b”和“wb”,在f_read函数中使用“rb”。 也:

  • 检查可能失败的来电的返回值,您会发现,例如fwrite失败了。
  • 你的f_rerite函数遍历6个元素,你就一个接一个。
  • 您的f_rerite也会写入下一个元素。可能你想更新当前的记录。这意味着你在调用fread之后需要再次尝试。

答案 1 :(得分:2)

"rw"错了。使用"r+"。阅读后别忘了回头。