2017-10-08 49 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值。