- ベストアンサー
バイナリファイル(画像)のよみこみ
レポートで1024×1024ピクセルの画像を、間引いて256×256の画像にしろというのが出されました。画像はrawファイルです。 それで、とりあえず画像を読み込んで、出力するプログラムを書いてみたんですが、コンパイルは出来るのに実行すると不正な処理とけいこくがでてきてしまいます。 ソースは #include<stdio.h> main() { unsigned char in[1024][1024],out[1024][1024]; FILE *fp; int i,j; fp=fopen("aaa.raw","rb"); fread(in,sizeof(unsigned char),1024*1024,fp); fclose(fp); for(i=0;i<1024;i++){ for(j=0;j<1024;j++) out[i][j]=in[i][j]; } fp=fopen("bbb.raw","wb"); fwrite(out,sizeof(unsigned char),1024*1024,fp); fclose(fp); } です。 どこがいけないのかアドバイスいただきたいです。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 #2 のmuyoshid です。 取りあえず、もう少し小さい単位でread/write する方法のプログラムを 記載してますので、参考にしてみて下さい。 ※ BUF_SZ の値を変更すると、read/write サイズを変更できます。 #include <stdio.h> #define IN_FILE "aaa.raw" #define OUT_FILE "bbb.raw" #define BUF_SZ 8192 // Buffer Size static int fcopy(FILE *, FILE *); main() { FILE *rfp, *wfp; int rinf; rfp = fopen(IN_FILE, "rb"); if (((FILE *)NULL) == rfp) { printf("File \"%s\" cannot open.\n", IN_FILE); exit(-1); } wfp = fopen(OUT_FILE, "wb"); if (((FILE *)NULL) == wfp) { printf("File \"%s\" cannot open.\n", OUT_FILE); exit(-1); } rinf = fcopy(rfp, wfp); fclose(rfp); fclose(wfp); printf("fcopy() = %d\n", rinf); exit(rinf); } static int fcopy(FILE *rfp, FILE *wfp) { unsigned char in_buf[BUF_SZ], out_buf[BUF_SZ]; int rinf; while(!feof(rfp)) { rinf = fread((void *)in_buf, 1, BUF_SZ, rfp); if (rinf < 0) { printf("File read error.\n"); return(-1); } memcpy((void *)out_buf, (void *)in_buf, BUF_SZ); rinf = fwrite((void *)out_buf, 1, rinf, wfp); if (rinf < 0) { printf("File write error.\n"); return(-1); } } return(0); }
その他の回答 (2)
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 mickjey2 さんもおっしゃられていますが、Stack Orverflow の可能性 が高いですね。 → ローカル変数が獲得される領域を超えて、変数を宣言したと言う事です。 解決策としては、 1) malloc で領域を獲得する。 2) in, out 変数をmain 関数の外で宣言する。 3) 一気にデータを読まずに、もう少し小さい単位でデータをread/write する。 といったところでしょうか?
お礼
回答ありがとうございます。 何とか動きました。
>unsigned char in[1024][1024],out[1024][1024]; 動的に malloc などで確保するようにしてみてください。 これでは一つの配列のサイズが、1Mbyteになります。 実行時にこのサイズが確保できていない可能性が高いです。 一般に静的に確保できる変数のサイズはそれほど大きくありません。
お礼
回答ありがとうございます。 お礼遅くなってすいません。mallocの使い方がわからなくて調べたりしてたら遅くなっちゃいました。 なんとか動きました。ありがとうございます。
お礼
わざわざありがとうございます。とても参考になりました。 何箇所か分からない関数もあったけど、なんとかなりました。 ありがとうございます。