2017-10-08 50 views
-1

我需要编写一个程序来读取-32767到32767范围内的二进制文件。到目前为止,下面的脚本将二进制文件读入-128的范围约二进制文件127将二进制文件读取到-32767到32767的整数范围

#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。

谢谢!

+0

你可能想读或者2或一次4个字节。 (你的问题标题建议两个字节,你的讲师说四个)。你可以使用'fread'。 (字节交换在理论上是一个问题,但对于此练习,您可能可以忽略它。) –

+0

如何一次读取2或4个字节? – fizsics

+0

你的问题说你想要一个简短的[]数组。你的老师说你想要一个int []数组。 –

回答

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]); 
0

使用4字节表示您的输入数据,即。即更换

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()函数的第二个参数。

+0

https://imgur.com/uNMxoaY这就是我得到的。 – fizsics

+0

'long int'不保证是4个字节。 –

+0

他需要2个字节而不是4个 –

0

我没有你的数据,以测试(我没有测试了我的答案),但它应该是这样的:

所有signed char shint[2000] = "";首先是持有2000年签署字符(这确实是带符号的8位值看起来是here - 处理数据类型大小时这是一个非常方便的资源),所以您需要一些值来保存带符号的32位(4字节)值,这取决于您的机器架构,假设它是32位整数(it is not difficult to find out)你可以容纳你的数值在int shint[2000] = "";

你需要注意的下一件事是功能freadhere is some friendly documentation,这个函数的第二个参数(在你的代码中是1)应该是字节数表示来自你想要读取的数据的单个值,所以在你的情况下应该是4(字节)。其他参数应该可以。

编辑:为了确保您正在阅读4个字节,您的确可以使用MarianD给出的答案并存储long值。