Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在读取二进制文件时进行移位?_C_Struct_Fread - Fatal编程技术网

C 如何在读取二进制文件时进行移位?

C 如何在读取二进制文件时进行移位?,c,struct,fread,C,Struct,Fread,我可以一个字节一个字节地读取我的所有结构字节(字节块很大,“sizeof(Today)”,所以它有8个字节大)。我尝试了越来越多次,但我做不到!请给我帮忙 Bin文件:“temp.Bin” 我的结构: typedef struct { int year; int month; } Today; 这是代码的一部分,每个周期应该读取8字节: Today *d; d = malloc(sizeof(Today)); fp = fopen("temp.bin", "rb");

我可以一个字节一个字节地读取我的所有结构字节(字节块很大,“sizeof(Today)”,所以它有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()函数更可能是错误的,但我尝试了所有可能的组合,但输出永远都不是正确的!
谢谢大家

您可能需要先为所有区块分配空间,例如:

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(“月份:%d”,d[5]。月份)


然后对数组中的每个元素执行您需要执行的操作,然后将其写回。取决于您的文件有多大,但您可能希望首先为所有块分配空间,例如

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(“月份:%d”,d[5]。月份)


然后对数组中的每个元素执行您需要执行的操作,然后将其写回。取决于你的文件有多大尽管你的代码中没有任何内容,我想你的文件格式并不像你想象的那样

我还想知道为什么必须为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;
}
#包括
#包括
类型定义结构
{
国际年;
整月;
}今天;
#定义数据文件“temp.bin”
int main(){
今天是d;
printf(“sizeof(今日)=%d\n”,sizeof(今日));
FILE*fp=fopen(数据文件,“wb”);

对于(inti=1;i,您的代码中没有任何内容,我想您的文件格式与您想象的不一样

我还想知道为什么必须为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;
}
#包括
#包括
类型定义结构
{
国际年;
整月;
}今天;
#定义数据文件“temp.bin”
int main(){
今天是d;
printf(“sizeof(今日)=%d\n”,sizeof(今日));
FILE*fp=fopen(数据文件,“wb”);

对于(int i=1;i在
malloc
之后调用
free
可能重复。我调用free,但从未发生过!是的,我打印了两个重复的值!旁注:
malloc
没有问题,但是如果您临时分配1个
今天的
,那么在本地将其定义为
Today d;
。这样你就不必处理
malloc/free
的麻烦了。你的结构很小,所以大小应该不是问题。在
malloc
之后,可能会重复调用
free
。我调用free,但从来没有发生过!是的,我打印了两个重复的值!旁注:
malloc
没有问题,但是如果y您今天暂时分配1
,只需在本地将其定义为
Today d;
就更简单了。这样您就不必处理
malloc/free
的麻烦了。您的结构非常小,所以大小不应该是一个问题。谢谢!不过,我随便在fwrite()和fread()之间插入了这一行:fsee(pF,0L,SEEK_SET);我能够阅读整个文件:D但是我得到了你的提示:D现在唯一的问题是,(!feof(f))最后循环两次,打印两次相同的值!…这就是为什么你的帖子被标记为dup。'read/check/act'很好。'check/read/act'是错误的。谢谢!但我无意中在fwrite()和fread()之间插入了这一行:fsee(pF,0L,SEEK\u SET);我能够阅读整个文件:D但是我得到了你的提示:D现在唯一的问题是,(!feof(f))做最后一个周期2次,打印2次相同的值!…这就是为什么你的帖子被标记为dup。'read/check/act'很好。'check/read/act'是错误的。如上所述,代码的最后一部分是while cycle,读取最后一个值的2倍!我正在努力修复它!谢谢you@user3649959代码现在运行正常,我将测试更改为返回
fread
而不是
eof
谢谢!这是有用的,因为上面写的代码的最后一部分是while循环,读取最后一个值的2倍!我正在努力修复它!谢谢you@user3649959代码现在工作正常,我将测试改为返回
fread
而不是
eof
谢谢!是的有用