0

バイナリ (.bin) ファイルを読み取る必要があります。このファイルには、RGBA データであるビデオ データが含まれています。各コンポーネントは 4096 バイトで構成され、型はunsigned charです。したがって、ファイルを開いて、以下のコード スニペットに示すようにファイルを読み取ります。

FILE *fp=fopen(path,"rb");
//Allocating memory to copy RGBA colour components
unsigned char *r=(unsigned char*)malloc(sizeof(unsigned char)*4096);
unsigned char *g=(unsigned char*)malloc(sizeof(unsigned char)*4096);
unsigned char *b=(unsigned char*)malloc(sizeof(unsigned char)*4096);
unsigned char *b=(unsigned char*)malloc(sizeof(unsigned char)*4096);

//copying file contents
fread(r,sizeof(unsigned char),4096,fp);
fread(g,sizeof(unsigned char),4096,fp);
fread(b,sizeof(unsigned char),4096,fp);
fread(a,sizeof(unsigned char),4096,fp);

データが r、g、b、a でコピーされると、それらは表示用の適切な関数に送信されます。上記のコードは、RGBA データの 1 つのセットをコピーする場合に問題なく機能します。ただし、コピーを続けて、表示用のデータを送信し続ける必要があります。

検索したところ、ファイルの内容を表示する例しか見つかりませんでしたが、テキストファイル、つまりEOF手法にのみ適しています。

したがって、上記のコード スニペットをループ (ループ条件) に挿入するための適切な提案を提供するようユーザーにお願いします。

4

2 に答える 2

1

fread には戻り値があります。エラーが発生した場合に確認したい。

fread() と fwrite() は、正常に読み書きされたアイテムの数を返します (つまり、文字数ではありません)。エラーが発生した場合、またはファイルの終わりに達した場合、戻り値は短い項目数 (またはゼロ) です。

したがって、fread を実行したい場合は、必ずエラーを探してください。

while (!feof(fp) {
  int res = fread(r,sizeof(unsigned char),4096,fp);
  if (res != 4096) {
     int file_error = ferror(fp)
     if (0 != file_error) {
        clearerr(fp)
        //alert/log/do something with file_error?
          break;
     }
  }
 //putting the above into a function that takes a fp 
 // and a pointer to r,g,b, or a would clean this up. 
 // you'll want to wrap each read
  fread(g,sizeof(unsigned char),4096,fp);
  fread(b,sizeof(unsigned char),4096,fp);
  fread(a,sizeof(unsigned char),4096,fp);
}
于 2013-04-03T16:33:40.010 に答える