【发布时间】:2014-03-29 07:49:16
【问题描述】:
我正在尝试编写一个 C 程序来显示二进制文件的内容,该文件包含如下存储的几个数字: 前 4 个字节包含一个整数 n,以小端格式存储。 接下来的 8n 字节包含以 8 字节双精度格式存储的 n 个浮点数数组
“数据”是用matlab制作的,这个文件包括:n = 7 array = [.7147, -.2050, -.1241, 1.4897, 1.4090, 1.4172, .6715]
到目前为止,这是我拥有的代码。本质上,我试图读取文件,通过我的小端函数发送这些变量,然后显示它。我不确定为什么我会得到我得到的结果。
#include <stdio.h>
#include <stdint.h>
/* function to show bytes in memory, from location str to str+n*/
void extract_little(char *str,int offs, int n);
void extract_big(char *str,int offs, int n);
/*Main function to call above function */
int ofset;
int main(){
int x;
int i[numE*4];
FILE* fp = fopen("data","rb");
fread(i,sizeof(i[x]),numE,fp);
fclose(fp);
for (x=1; x < numE;x++)
printf("%d%\n",i[x]);
//extract_little((char *)&i, ofset, sizeof(i));
return 0;
}
void extract_little(char *str,int offs, int n)
{
int i;
for (i = 0; i < n; i++){
printf(" %04f\n\n", (unsigned int) str[i]);
}
}
新成果
-2103482977
1072095020
-359136765
-1077265325
-1953332745
-1077950484
不是 100% 确定这是否正确,但这是一个开始。不幸的是,没有使用它需要的功能。
【问题讨论】:
-
这在 multiple 级别上是错误的。将
double读取为二进制文件,传递int的大小作为该列表的前导。将 sevenint值读入 single double 的地址:完全未定义的行为。 -
对不起,我发布了错误的版本。我已经玩了一段时间了,所以事情变得混乱了。我只是用细微的变化来修复它。我现在在 printf 中是 int 和 unsigned int。但是,我仍然收到一个错误,我无法弄清楚如何修复。
-
即使在“修复”之后,将
int大小的 7 个 项读取到 singleint的地址中也会调用 undefined行为。而extract_little仍然是错误的。支持将单个char转换为unsigned int,但不支持将其打印为 float。您需要查看有关数据提取的说明。您应该读取四个unsigned char,然后使用按位操作从这四个字节中制造一个平台-int以获取n,然后为ndouble元素分配空间并将其余数据读入说分配的缓冲区。 -
好的,我进行了彻底的搜索并打印,完全没有使用我的功能。我(认为)这是正确的,实际上并不确定,因为数字太奇怪了。
标签: c binaryfiles endianness