2017-10-08 3 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を読みたいのintまたは一度に4バイト。 (あなたの質問のタイトルは2バイトを示唆している、あなたの講師は4つを言った)。おそらく 'fread'を使うことができます。 (バイトスワッピングは理論的には問題ですが、この演習では無視しても差し支えありません) –

+0

一度に2バイトまたは4バイトを読み取るにはどうすればよいですか? – fizsics

+0

あなたの質問は、短い[]配列が必要だと言っています。あなたの先生はint []配列が必要だと言った。 –

答えて

0

私はあなたがcharとsigned 16ビットintsに簡単にアクセスしたいと思っています。

#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バイトの表記を使用します。 e。

if ((bytes = fread(&shint, 4, 2000, fp)) > 0) { //bytes more than 0 

long int shint[2000] = ""; 

if ((bytes = fread(&shint, 1, 2000, fp)) > 0) { //bytes more than 0 

signed char shint[2000] = ""; 

置き換えますあなたの変数の名前によって

shint、私は:

printf ("%ld\n", shint[i]); 

と。 e。 short int)と-32768+32767の範囲では、指導者が4ではなく数字の場合は2バイトを望んでいるようです。
その場合、宣言で(または単にshort)を使用し、fread()の第2パラメータとして2を使用してください。

+0

https://imgur.com/uNMxoaYこれが私のものです。 – fizsics

+0

'long int'は4バイトであるとは限りません。 –

+0

彼は4バイトではなく2バイトが必要です –

0

私は上のテストするために、あなたのデータを持っていない(と私は私の答えをテストしていませんでした)が、それはこのようなものでなければなりません:すべてのsigned char shint[2000] = "";

まず確かである(2000文字を署名保持しているが符号付き8ビット値は、hereのように見えます - これはデータ型サイズを扱う際の非常に便利なリソースです)、符号付き32ビット(4バイト)の値を保持するためには値が必要です。整数(it is not difficult to find out)あなたは値を保持することができますint shint[2000] = "";

次のことに注意する必要がある関数はfreadですhere is some friendly documentation、この関数の2番目のパラメータ(コードでは1)は、読み込みたいデータの単一の値を表すバイト数である必要があります。そのため、状況は4(バイト)になります。他のパラメータはOKでなければなりません。

編集:確かにあなたはMarianDによって与えられた答えを使用してlongの値を実際に使用できる4バイトを読んでいることを確認してください。

関連する問題