如何在阅读时移入二进制文件?

时间:2015-10-21 10:03:56

标签: c struct fread

我能够按字节读取所有结构字节(字节块大“sizeof(今天)”所以它大8字节)。我尝试的次数越来越多,但我不能!请帮帮我!

Bin文件:“temp.bin”

我的结构:

typedef struct
{
    int year;
    int month; 
} Today;

这是代码的一部分,应该在每个周期读取8个字节:

 Today *d;
 d = malloc(sizeof(Today));

 fp = fopen("temp.bin", "rb"); 

 while(!feof(fp))
 { 
     fread(d, sizeof(Today), 1, fp);

     printf("Year = %i\n", d->year);
     printf("Month = %i\n", d->month);     
 } 

 fclose(fp);

while条件和fread()函数更可能是错误的,但我尝试了所有可能的组合,但输出永远不是正确的! 谢谢大家

2 个答案:

答案 0 :(得分:0)

您可能希望首先为所有块分配空间,例如

fp = fopen( "temp.bin", "rb" );
if ( fp != NULL )
{
   fseek( fp, 0L, SEEK_END );
   size_t size = ftell(fp);
   rewind(fp);

   Today *d;
   d = malloc(size);
   fread( d, sizeof(Today), size/sizeof(Today), fp );
   fclose(fp);
}

然后你得到了数组中的结构

e.g。 printf( "month: %d", d[5].month);

然后在数组中的每个元素上执行您需要执行的操作,然后再将其写回。取决于您的文件有多大

答案 1 :(得分:0)

您的代码没有任何内容,我猜您的文件格式并不像您想象的那样。

我也徘徊为什么你必须为struct分配内存。

此处的代码与您提供的代码类似。它只是演示以您描述的格式写入数据,然后检索它而不会丢失。

#include <stdio.h>
#include <string.h>
typedef struct
{
    int year;
    int month; 
} Today;

#define DataFile    "temp.bin"
int main(){
    Today d;
    printf("sizeof(Today)=%d\n",sizeof(Today));

    FILE  *fp = fopen(DataFile, "wb");
    for(int i=1;i<13;i++){
        d.month=i;
        d.year=2000+i;
         fwrite(&d, sizeof(Today), 1, fp);
    } 
    fclose(fp);

    printf("write complete, press a key to read\n");
    _getch();

    fp = fopen(DataFile, "rb"); 

    while(fread(&d, sizeof(Today), 1, fp)){ 
         printf("Year = %i\t", d.year);
         printf("Month = %i\n", d.month);     
    } 
    fclose(fp);
    return 0;
}