2017-10-08 17 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을 읽을 수 INTS 또는 한 번에 4 바이트. (당신의 질문 제목은 2 바이트를 제안합니다, 당신의 강사는 4 개를 말했습니다). 아마도'fread'를 사용할 수 있습니다. (바이트 스와핑은 이론적으로 문제이지만이 연습에서는 무시할 수 있습니다.) –

+0

한 번에 2 바이트 또는 4 바이트를 읽으려면 어떻게해야합니까? – fizsics

+0

귀하의 질문에 짧은 [] 배열이 필요합니다. 선생님이 int 배열을 원한다고하셨습니다. –

답변

0

나는 당신이 chars와 signed 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 바이트 표현을 사용하십시오. 이자형.

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

주와 7,013,210

. 이자형. short int) 그리고 -32768 ~ +32767 범위에서 강사가 4이 아닌 2 바이트를 숫자로 원했던 것으로 보입니다.
그런 경우 short int (또는 간단히 short)을 선언에 사용하고 2fread()의 두 번째 매개 변수로 사용하십시오.

+0

https://imgur.com/uNMxoaY를 참조하십시오. 이것이 내가 가진 것입니다. – fizsics

+0

'long int'는 4 바이트가 될 수 있습니다. –

+0

그는 4가 아니라 2 바이트가 필요합니다. –

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 (바이트)가되어야합니다. 다른 매개 변수는 OK 여야합니다.

편집 : 4 바이트를 읽었는지 확인하려면 MarianD에서 주어진 대답을 실제로 사용할 수 있으며 long 값을 저장하십시오.