使用fread& fwrite,与二进制有关

时间:2013-04-14 02:41:31

标签: c binary fwrite fread

我无法理解为什么我的代码没有按预期工作,我确信这与我对fread和fwrite的理解有关。

这是我的代码片段,原谅格式和懒惰的风格。

typedef struct record_t{
char name[20];
unsigned int id;
char toy[30];
}record_t;



int main(int argc, char** argv){


FILE *readFile, *writeFile;
record_t *recordPtr; 
int i;

if( (recordPtr = malloc(sizeof(struct record_t))) == NULL)
{
    perror("Error allocating record space\n");
    exit(EXIT_FAILURE);
}

strcpy(recordPtr->name, "Michael"); 
recordPtr->id = 3;
strcpy(recordPtr->toy, "Hello Kitty");
printf("Writing %s - %d - %d - %d - %s\n", recordPtr->name,
    recordPtr->id, recordPtr->toy);

if( (writeFile = fopen("test.bin", "wb")) == NULL)
{
    perror("Error opening writing file\n");
    exit(EXIT_FAILURE);
}

for(i = 0; i < 2; ++i){
recordPtr->id = i ;
fwrite(&recordPtr, sizeof(struct record_t), 1, writeFile);
printf("%s - %d - %s, ", recordPtr->name, recordPtr->id, recordPtr->toy);
printf("Record Written.\n");

}
fclose(writeFile);

recordPtr = NULL;

if( (readFile = fopen("test.bin", "rb")) == NULL)
{
    perror("Error opening reading file\n");
}
    exit(EXIT_FAILURE);

recordPtr = NULL;


for(i=0; i < 2; ++i){
    fread(&recordPtr, sizeof(struct record_t), 1, readFile);
    printf("%s - %d - %s, Read back.\n" recordPtr->name, recordPtr->id, recordPtr->toy);
}
fclose(readFile);


exit(EXIT_SUCCESS);
}

代码的想法只是记录,将其写入二进制文件,然后从二进制文件中读回。 我的问题是只读回最后一个条目,所以我确定我对fread的理解有问题。

提前谢谢你。

2 个答案:

答案 0 :(得分:1)

fwrite(&recordPtr, sizeof(struct record_t), 1, writeFile);

没有将结构写入文件,它试图将指针recordPtr写入其中,然后在内存中跟随它。

同样这个

fread(&recordPtr, sizeof(struct record_t), 1, readFile);

没有将结构读入你为它分配的内存中,它试图用文件数据覆盖指针recordPtr以及内存中的任何内容。

你需要丢掉那个&符号。

答案 1 :(得分:1)

fwrite(&recordPtr, sizeof(struct record_t), 1, writeFile);
fread(&recordPtr, sizeof(struct record_t), 1, readFile);

应该是:

fwrite(recordPtr, sizeof(struct record_t), 1, writeFile);
fread(recordPtr, sizeof(struct record_t), 1, readFile);

下一步:

if( (readFile = fopen("test.bin", "rb")) == NULL)
{
    perror("Error opening reading file\n");
}
exit(EXIT_FAILURE);

应该是

if( (readFile = fopen("test.bin", "rb")) == NULL)
{
    perror("Error opening reading file\n");
    exit(EXIT_FAILURE);
}

并且

当你回读结构时,缓冲区指向NULL! 因此,请确保在recordPtr中使用recordPtr之前分配内存并使fread指向它。