将二进制文件读取到-32767到32767的整数范围

时间:2017-10-08 14:18:34

标签: c binary short

我需要创建一个程序来读取-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数据。虽然将来我需要阅读所有这些内容。

The final data representation

这就是我想在一天结束时的情节。获得所需数据后,我会调用matlab或scilab。

谢谢!

3 个答案:

答案 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]);