我有一个二进制文件,我将使用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;
}
答案 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);