2010-06-13 3 views
1

아래의 C++ 프로그램이 파일을 읽지 못했습니다. 나는 cstdio를 사용하는 것이 좋은 습관이 아니라는 것을 압니다.하지만 익숙한 것은 어쨌든 작동해야합니다.간단한 바이너리 cstdio (C++) 파일 I/O 문제

$ 1! -l l.uyvy

-rw-R - r--로 1 개 아틸라의 아틸라 리터 ./a.out 614,400 2010-04-24 18시 11분 l.uyvy

$ 아마도 잘못된 파일, 614,400 밖으로

읽기 0 바이트를 .uyvy

코드 : 당신은 다시 매개 변수를 가지고

#include<cstdio> 
int main(int argc, char* argv[]) 
{ 
    FILE *fp; 

    if(argc<2) 
    { 
      printf("usage: %s <input>\n",argv[0]); 
      return 1; 
    } 

    fp=fopen(argv[1],"rb"); 
    if(!fp) 
    { 
      printf("erör, cannot open %s for reading\n",argv[1]); 
      return -1; 
    } 
    int bytes_read=fread(imgdata,1,2*IMAGE_SIZE,fp); //2bytes per pixel 
    fclose(fp); 
    if(bytes_read < 2*IMAGE_SIZE) 
    { 
      printf("Read %d bytes out of %d, possibly wrong file\n", 
       bytes_read, 2*IMAGE_SIZE); 
      return -1; 
    } 
    return 0; 
} 

답변

0

포인터를 초기화하여 문제가 해결되었습니다. 흥미롭게도, 초기화되지 않은 포인터를 읽으려고 할 때 세그 폴트를 제공하는 대신 읽기가 실패합니다. 이는 혼란 스럽습니다.

+1

버퍼를 제공해야한다는 것을 알게되면 혼란스럽지 않습니다. 'fread'는 버퍼를 생성하지 않습니다. 실제로 모든 단일 파일 작업에 새 버퍼가 할당되기를 원하지 않기 때문에 실제로 좋은 것입니다. 아주 자주, 같은 버퍼를 몇 번이고 다시 사용할 수 있습니다. (성능을 생각하십시오!) - 최종 힌트로써, 당신의 경우에, 고정 크기 버퍼로서'imgdata '를 초기화하지 않도록하십시오. 읽고있는 파일의 크기에 따라 초기화해야합니다. 파일 크기는'fseek (fp, 0, SEEK_END);와'long fileSize = ftell (fp);'를 호출하여 얻을 수 있습니다. – stakx

2

크기와 nmemb에 대한 전면에

http://www.manpagez.com/man/3/fread/

, 당신은 imgdata 버퍼에 대한 선언을 제공하지 않은 또한, 대신

int bytes_read = fread (imgdata, 2*IMAGE_SIZE, 1, fp); 

을 시도, 당신은 버퍼가 큰해야 할 것 충분히 - 또는 정확하게 malloc되었습니다.