2012-05-31 3 views
1

나는 C 꽤 새로운 해요,하지만 난 FREAD에 문제가 건너왔다C, bin 파일에서 FREAD 바이너리

... 
FILE *file = fopen("test1.bin", rb); 
int i = 0; 
fread(&i, 1, 1, file); 
printf("%i\n", i); 
... 

지금 난에이 시도했습니다

내 코드,하지만 지금은 한 단계 한 번에 복용하고 바로 첫 번째 비트를 읽으려고위한 .BIN 파일 ... 3 개의 다른 .bin 파일, 하나는 0, 다른 하나는 2, 다른 하나는 12입니다.

파일에서 하나의 1 비트 만 읽는 중 왜 2/12를 출력합니까? 그것은 0이나 1이되어서는 안됩니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 고마워.

+4

1 비트가 아니라 1 바이트를 읽습니다. :) – Pethical

+0

좋아요, 괜찮습니다. 32 비트 만 읽으 려한다면 1, 1, 4, 1로 바꿀까요? –

+2

sizeof (int), 1로 변경하는 것이 좋습니다. – Pethical

답변

6

변화는 호출에 fread() : 두 번째 인수는 판독 소자의 크기

fread(&i, sizeof(int), 1, file); 

는 제 3 인자는 판독 소자의 개수이다. 게시 된 코드는 단일 바이트를 int으로 읽습니다.

fopen()fread() 호출의 반환 값도 확인하여 성공했는지 확인해야합니다.

1

@hmjd처럼, int 값을 채우기 위해 필요한 바이트 수를 읽어야합니다. 그래서이 두 방법 :

len = fread(&i, sizeof(int), 1, file); 

또는 이러한 방법 :

len = fread(&i, 1, sizeof(int), file); 

첫번째 경우 하나 개 int 값 (일반적으로 4 바이트 등)를 판독한다. 통화가 끝난 후 len은 읽기가 성공하면 1과 같아야합니다.

두 번째 경우는 int 값으로 여러 바이트를 읽습니다. 차이점은이 호출 후에는 lensizeof(int)과 같아야한다는 것입니다.

첫 번째 방법은 다중 바이트 단일 개체 (int)를 읽도록 지정하는 반면 두 번째 방법은 개체에 읽을 바이트 수를 지정하는 것입니다. 미묘한 차이점이 있습니다. 물론 사람들은 동의하지 않을 것입니다.

두 번째 방법의 장점은 실제로 얼마나 많은 바이트가 실제로 읽혔는지 알려주는 것입니다 (I/O 오류를 디버깅하는 데 유용 할 수 있음). 첫 번째 방법의 장점은 성공을위한 개념적으로 간단한 테스트라는 것입니다 (int 읽기 여부).

하지만 어떻게 수행하든 항상 반환 값 fread()을 확인해야합니다.

관련 문제