我需要创建一个程序来读取-32767到32767范围内的二进制文件。到目前为止,下面的脚本将二进制文件读取到-128到127的范围内。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp = NULL;
signed char shint[2000] = "";
int i = 0;
size_t bytes = 0;
if ((fp = fopen("raw_data.ht3", "rb")) == NULL) {
printf ("could not open file\n");
return 0;
}
if ((bytes = fread(&shint, 1, 2000, fp)) > 0 ) { //bytes more than 0
for (i = 0; i < bytes; i++) {
printf ("%d\n", shint[i]);
}
}
fclose(fp);
return 0;
}
关于二进制文件的更多信息,我的讲师说二进制文件应该读入4字节数据(我不确定我的措辞是否在这里)。数据非常大,所以我停止数据读取直到2000数据。虽然将来我需要阅读所有这些内容。
这就是我想在一天结束时的情节。获得所需数据后,我会调用matlab或scilab。
谢谢!
答案 0 :(得分:0)
对输入数据使用4
字节表示,i。即取代
signed char shint[2000] = "";
与
long int shint[2000] = "";
和
if ((bytes = fread(&shint, 1, 2000, fp)) > 0 ) { //bytes more than 0
与
if ((bytes = fread(&shint, 4, 2000, fp)) > 0 ) { //bytes more than 0
和
printf ("%d\n", shint[i]);
与
printf ("%ld\n", shint[i]);
注意:
通过变量的名称(shint
,即short int
)和范围-32768
到+32767
,您的教师似乎需要2
个字节对于数字,而不是4
在这种情况下,请在声明中使用short int
(或简称为short
),并将2
作为fread()
函数的第二个参数。
答案 1 :(得分:0)
我没有测试你的数据(我没有测试过我的答案)但它应该是这样的:
首先signed char shint[2000] = "";
持有2000个带符号的字符(确实是带符号的8位值看起来here - 这是处理数据类型大小时非常方便的资源),所以你需要一些值保存有符号的32位(4字节)值,这取决于您的机器架构,假设它是32位整数(it is not difficult to find out),您可以在int shint[2000] = "";
接下来需要注意的是函数fread
here is some friendly documentation,此函数的第二个参数(代码中为1)应该是字节数表示来自的单个值您想要读取的数据,因此在您的情况下应该是4(字节)。其他参数应该没问题。
编辑:为了确保您正在读取4个字节,您可以使用MarianD给出的答案并存储{{1}}值。
答案 2 :(得分:0)
据我了解,您希望轻松访问字符并签署16位整数。
#define SIZE 2000
union
{
char shint_c[SIZE * 2];
short shint[SIZE];
}su;
然后在你的
中fread(&su, 2, SIZE, fp)
并在循环中打印短裤
printf ("%hd\n", su.shint[i]);
或8位整数
printf ("%hhd\n", su.shint_c[i]);