簡體   English   中英

讀取二進制文件到 -32767 到 32767 的整數范圍

[英]Read binary file to integer range of -32767 to 32767

我需要編寫一個程序,將二進制文件讀入-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。

謝謝!

對輸入數據使用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()函數的第二個參數。

我沒有你的數據來測試(我沒有測試我的答案)但它應該是這樣的:

首先signed char shint[2000] = ""; 持有 2000 個有符號字符(它們確實是有符號的 8 位值,請看這里- 這是處理數據類型大小時非常方便的資源),因此您需要一些值來保存有符號的 32 位(4 字節)值,這取決於您的機器架構,假設它是 32 位整數( 不難找出),您可以將值保存在int shint[2000] = "";

接下來你需要注意的是函數fread這里是一些友好的文檔,這個函數的第二個參數(在你的代碼中是 1)應該是字節數,代表你想要讀取的數據中的單個值,所以在你的情況下應該是 4(字節)。 其他參數應該沒問題。

編輯:為了確保您正在閱讀 4 個字節,您確實可以使用 MarianD 給出的答案並存儲long值。

據我了解,您希望輕松訪問字符和帶符號的 16 位整數。

#define SIZE 2000

union
{
    char shint_c[SIZE * 2];
    short shint[SIZE];
}su;

然后在你的 if

fread(&su, 2, SIZE, fp)

並在循環中打印短褲

printf ("%hd\n", su.shint[i]);

或 8 位整數

printf ("%hhd\n", su.shint_c[i]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM