2010-06-13 4 views
1

Ниже приведенная ниже программа C++ не может прочитать файл. Я знаю, что использование cstdio - это не хорошая практика, но то, к чему я привык, и он должен работать в любом случае.Простая двоичная проблема ввода-вывода файла с cstdio (C++)

$ Ls -l l.uyvy

-rw-р - r-- 1 Atilla Atilla 614400 2010-04-24 18:11 l.uyvy

$ ./a.out л .uyvy

Чтение 0 байт из 614400, возможно, неправильно файл

код:

#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

Я решил проблему, инициализируя указатель. Интересно, что чтение прерывается вместо того, чтобы давать segfault, когда вы пытаетесь прочитать неинициализированный указатель, что было непонятно.

+1

Это не так запутанно, если вы знаете, что вам нужно * предоставить * буфер, 'fread' не создает его для вас. На самом деле это хорошо, потому что вы действительно не хотите иметь новый буфер, выделенный для каждой операции с файлом. Очень часто вы можете повторно использовать один и тот же буфер снова и снова. (Подумайте о производительности!). В качестве окончательного намека, в вашем случае, не нужно инициализировать 'imgdata' как буфер фиксированного размера. Вы должны инициализировать его в соответствии с размером файла, который вы читаете. Вы можете получить размер файла через вызовы 'fseek (fp, 0, SEEK_END);' и затем 'long fileSize = ftell (fp);' – stakx

2

у вас есть параметры назад на передней панели для размера и nmemb

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

Попробуйте вместо этого,

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

Кроме того, вы не предоставили декларацию для буфера imgdata, вы хотите быть уверены, что буфер большой достаточно - или был malloc'd правильно.

Смежные вопросы