c - 如何从每个元素需要不同字节长度的外部二进制文件中读取数据?

标签 c

情况是这样的。我必须从外部二进制文件中读取数据并按顺序显示数据,以便用户理解。

该文件存储的数据如下:前4个字节是一个整数,接下来的8个字节是一个 float ,接下来是接下来的8个字节(float),等等。所以我首先需要读入4个字节,然后重复 8 个字节...直到文件没有数据可读。

我读取文件的方式是将其数据存储到数组 i[NUM](其中 NUM 是元素的数量),并且每个元素包含 4 个字节。通过这样做,我不小心将 float “拆分”为两半,前半部分存储在 i[1] 中,下半部分存储在 i[2] 中, i[3]i[4] 等中的 float

现在我正在尝试将每个 float 的两半再次“缝合”在一起以显示它们,但我被卡住了。

非常感谢任何建议。

到目前为止我的代码:

#include "stdafx.h"
#include "stdio.h"

#define NUM 15

int main(void)
{
//initialising
int i[NUM], j, k;
float temp[NUM];
char temp_c[NUM];
int element_size = 4;
int element_number = NUM;
for(k=0; k<NUM; k++)
{
    i[k] = 0; //clear all cells in i[]
    temp[k] = 0; //clear all cells in temp[]
}

//file reading
FILE *fp;
fp = fopen("C:\\data", "rb+");
fread(&i, element_size, element_number, fp); //reads 'data' to the end and then stores each element into array i[]
fclose(fp); //close the file

//arrange and print data here
printf("Data of File\n\nN = %d",i[0]);

//this is where the rest fell apart
    //No idea how to go about it

return 0;
}

最佳答案

如果你确定 float 是 8 个字节而 int 是 4 那么你可以这样做(可能在一个循环中使用变量而不是固定索引我用过):

memcpy(&temp[0], &i[1], 8);

我假设您创建文件的代码是 fwrite,您在其中写入 4 字节 int,然后写入 8 字节 float 。

然后您可以使用 printf("%f\n", temp[0]); 或其他任何方式输出 float 。

注意。您可以通过直接初始化数组来避免初始化循环:int i[NUM] = { 0 }; 等。这仅适用于 0,不适用于其他值。

关于c - 如何从每个元素需要不同字节长度的外部二进制文件中读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22727160/

相关文章:

c - zmq_socket() 给出段错误

无法在 GtkTreeView 可编辑行中使用键盘键入(但可以右键单击+粘贴)

c++ - LoadLibrary 与将二进制 dll 加载到进程中?

c - 适用于 Windows CE 的 snprintf

c - 数组中数字序列的最小总和。不需要代码

c - 通过左移将 16 位模式传输到另一个寄存器

c - 添加指针地址 - 合法性

c - C语言如何将变量的值存储在文件中

c++ - 根据是 C 还是 C++ 执行 header 中存在的不同代码

c - C 中的 "struct namespace"是否有技术原因?