2016-10-17 3 views
0

bmp 파일에서 특정 정보를 읽으려고합니다. 기본적으로 파일 유형, 즉 BMP 파일에 B M이 있습니다. 먼저 파일을 여는 것으로 시작합니다. 어떤 일이 올바르게 일어나고 있는지. 그러나 첫번째 fread는 실패하고 있습니다. 왜 이런 일이 일어나는 걸까요?bmp 파일을 올바르게 읽을 수 없습니다.

#include<stdio.h> 
#include<string.h> 

#define SIZE 1 

int main(void) 
{ 
    FILE* fd = NULL; 
    char buff[2]; 
    unsigned int i=0,size=0,offset=0; 
    memset(buff,0,sizeof(buff)); 

    fd = fopen("RIT.bmp","r+"); 

    if(NULL == fd) 
    { 
     printf("\n fopen() Error!!!\n"); 
     return 1; 
    } 

    printf("\n File opened successfully\n"); 

    if(SIZE*2 != fread(buff,SIZE,2,fd))//to read the file type.(i. e. B M) 
    { 
     printf("\n first fread() failed\n"); 
     return 1; 
    } 
    return 0; 
} 

출력

File opened successfully 

first fread() failed 
Press any key to continue . . . 

업데이트

예 파일이 때문에 일부 이전 오류로 비어 있습니다. 그래서이 오류가오고 있습니다.

+0

아직도 이진 파일로 열어보고 싶지 않습니까? – 0xC0000022L

+1

읽은 바이트 수는 얼마입니까? 얼마나 많은 파일에 있습니까? (당신이 eof를 치면 당신이 요구하는 것보다 덜 얻을 수 있습니다) 이것은 C++보다 더 C입니다. 파일을 닫는 것을 잊지 마십시오. errno 또는 ferror를 검사 해 보셨습니까? http://en.cppreference.com/w/c/io/ferror – doctorlove

+0

fread의 실제 결과를 인쇄하는 것이 도움이 될 수 있습니다. – stefaanv

답변

0

아마도 파일에 충분한 (2 바이트) 데이터가 없습니다. 파일> 2 바이트로 검사했을 때 올바른 출력을 제공합니다. 빈 파일에 대해 동일한 오류가 발생했습니다.

+0

예, 기본 파일이 손상되었습니다. – gpuguy

+0

내 대답이 도움이된다면, 투표를 잊지 말아주세요 :) –

0

man page에서 : "성공적으로 완료되면 fread()는 요소 수를 성공적으로 [...]으로 반환해야합니다."

그 값은 SIZE*2이 아니라 2가됩니다.

두 번째 생각에서 SIZE은 1이지만 프로그램이 오류가 발생하기 쉽지만 실제로는 잘못된 것은 아닙니다. 이 경우 문장의 두 번째 부분이 적용됩니다 : "... 읽기 오류 또는 파일 끝이있는 경우에만 nitems보다 적습니다." 그리고 다른 사람들이 말했듯이, 파일이 충분히 길다면 세계 errno을 확인하십시오. 어쩌면 새로운 SSD를위한 시간입니다.

관련 문제