二进制文件中的文件位置不正确

时间:2014-03-28 16:50:57

标签: c

我正在将二进制文件读入一组外部文本文件以进行后期处理。我的代码如下:

for(k = 0; k < 76; k++) {
    for(j = 0; j < 76; j++) {
        curr = curr + j + k*(dim - 76);
        sprintf(Filename, "%s_%d.txt", file,count);
        fp = fopen(Filename, "w");
        for(i = 0; i < 256; i++) {
            fseek(qFile, (curr + i*dim*dim) * sizeof(float), SEEK_SET);
            fprintf(oFile, "%f\n", curr + i*dim*dim);
            fread(&temp, sizeof(float), 1 ,qFile);
            fprintf(fp, "%5.2f\n", temp);
        }
        fclose(fp);
        count++;
    }
}

但是,当我查看oFile指向的文件时,每组256个值的起始位置不会间隔1,但如下所示:

67024216
67024216
67024216
67024220
67024224
67024228
67024232
67024240
67024248
67024256
67024264
67024276
67024288
67024300
67024312
.
.
.

我看不出为什么单个元素中的间距是4,我知道浮点数的大小是4字节,但是打印到文件的值不是字节数,而是多个的字节数。

2 个答案:

答案 0 :(得分:1)

Single-precision floating-point numbers不像整数一样工作。它们实际上具有 less 精度,因为8位用于符号和指数。这让你有24位。

你的所有数字恰好都符合24位。或者,相反,他们如果你丢掉了低两位,这恰好总是为零(即增加4的倍数)。

我不知道它是否会在这里解决你所有的问题,因为我显然不知道项目的细节。但是,如果您将float定义更改为double,则至少应该让您解决此问题。

答案 1 :(得分:0)

编辑如下的代码产生了理想的结果:

for(k=0;k<76;k++){
  curr = init+k*dim;
  for(j=0;j<76;j++){
curr = init+j+k*dim;
sprintf(Filename,"%s_%d.txt",file,count);
fp=fopen(Filename,"w");
for(i=0;i<256;i++){

  fseek(qFile,(curr+i*dim*dim)*sizeof(float),SEEK_SET);
  fprintf(oFile,"%lf\n",curr+i*dim*dim);
  fread(&temp,sizeof(float),1,qFile);

  fprintf(fp,"%5.2f\n",temp);
}
fclose(fp);
count++;
  }
}