3

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

但是,我不知道将什么值传递给 fread 作为其第二个参数。我知道文件大小是 536870912 位。二进制文件是在 512^3 数组被访问的基础上构建的。这意味着每个数据条目在二进制文件中都是浮点类型,为每个数据元素指定 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;
}
4

3 回答 3

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]; 
于 2013-06-28T00:20:22.223 回答
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);
于 2013-06-28T00:21:59.793 回答
-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);
于 2013-06-28T00:05:02.813 回答