二进制文件中每条记录的大小

时间:2013-06-27 23:58:47

标签: c

我有一个二进制文件,我将使用fread将这个二进制文件中的数据读入一个结构数组。

但是,我不知道作为第二个参数传递给fread的值是什么。我知道文件大小是536870912位。二进制文件是在访问512 ^ 3阵列的基础上构建的。这意味着每个数据条目在二进制文件中都是float类型,为每个数据元素指定了4个字节。

我提到位时出错了。我读了一个C程序输出的内容,找到了文件的大小 - 它输出了536870912位!向任何困惑的人道歉。

以下是我用于将二进制文件中的数据读入我的结构文件的代码(简化结构 - 还有10个其他参数!)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

// Define the model structure
struct model {
        float density;
};


// Entry point for the program
int main () {
    int counter;
    long lSize;
    char * buffer;
    size_t result;
    FILE *pFile;
    int i,j,k,ibox;         /* Loop indices for the physical grid */

    struct model ***mymodel;

    pFile = fopen("core1_dens_0107.bin","rb");
    if (pFile == NULL) { printf("Unable to open density file!"); exit(1); }

    // obtain file size:
    fseek (pFile , 0 , SEEK_END);
    lSize = ftell (pFile);
    rewind (pFile);

    printf( "File size : %lu Bits \n", lSize );

    for ( j = 0 ; j < 512 ; j++ ) {
        for ( k = 0; k < 512; k++ ) {
            for ( i = 0; i < 512; i++ ) {
          fread(&mymodel[i][j][k].density,4,1,pFile);
              printf("%f \n",mymodel[i][j][k].density);
            }
        }
    }               

    fclose(pFile);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

假设您已经打开了文件并且文件描述符为myStream,那么它应该像这样简单:

#define MY_DIM = 512; ///Maybe you want to play safe and make it a little bit larger? Up to you

float buffer[MY_DIM][MY_DIM][MY_DIM];

size_t readBytes;

int i,j,k;
for (k = 0; k < MY_DIM; k++)
  for (j = 0; j < MY_DIM; j++) {
      readBytes = fread((void*) (buffer[k][j]), sizeof float, MY_DIM, myStream); //I am not sure the (void*) conversion is necessary
      if (readBytes < MY_DIM) //I unexpectedly reached the end of the file,
        goto endOfTheLoop;    //without reading all the data I needed for int
                              //You could also print a warning message
      }      

endOfTheLoop:

//Now close the input file, use fclose or something

//Now that you have read all the data, you have to put it in your array of struct:
for (k = 0; k < MY_DIM; k++)
  for (j = 0; j < MY_DIM; j++)
    for (i = 0; i < MY_DIM; i++)
      mymodel[k][j][i].density = buffer[k][j][i]; 

答案 1 :(得分:0)

您可以传递对您的程序最方便的第二个参数的任何值。如果要一次处理一个结构文件,请执行以下操作:

nread = fread(&your_struct, 1, sizeof yourstruct, stream);

如果你有一组结构,例如

struct foo your_struct[STRUCT_COUNT];

你可以这样做:

nread = fread(your_struct, STRUCT_COUNT, sizeof *your_struct, stream);

答案 2 :(得分:-1)

size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream );

将尝试每个nmemb字节块size块。它将保证不读取部分块。如果您的块是4位长,那么我建议您逐字节读取它们,否则使用size参数指定块大小。

例如

fread(buffer, 1, 1024, stdin);

将尝试读取1024个字节,但可能会在任何时候停止。

fread(buffer, 4, 256, stdin);

将尝试读取1024个字节,但是以4个字节为单位。总共256个块。它将保证不读取部分块。

fread(buffer, 1024, 1, stdin);

将尝试读取一个1024字节的块。如果它不能 - 什么都不会被阅读。

如果您希望阅读整个文件,那么您可以通过以下方式以4块为单位进行阅读:

size_t read, read_now;
while (read < filesize && (read_now= fread(buffer +read, 4, (filesize - read) >> 2, in)) != EOF)
    read += read_now;
你可以尝试一次性阅读整篇文章:

fread(buffer, filesize, 1, in);