レポートで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);
}
です。
どこがいけないのかアドバイスいただきたいです。よろしくお願いします。
No.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);
}
わざわざありがとうございます。とても参考になりました。
何箇所か分からない関数もあったけど、なんとかなりました。
ありがとうございます。
No.2
- 回答日時:
こんにちわ。
mickjey2 さんもおっしゃられていますが、Stack Orverflow の可能性
が高いですね。
→ ローカル変数が獲得される領域を超えて、変数を宣言したと言う事です。
解決策としては、
1) malloc で領域を獲得する。
2) in, out 変数をmain 関数の外で宣言する。
3) 一気にデータを読まずに、もう少し小さい単位でデータをread/write する。
といったところでしょうか?
No.1
- 回答日時:
>unsigned char in[1024][1024],out[1024][1024];
動的に malloc などで確保するようにしてみてください。
これでは一つの配列のサイズが、1Mbyteになります。
実行時にこのサイズが確保できていない可能性が高いです。
一般に静的に確保できる変数のサイズはそれほど大きくありません。
回答ありがとうございます。
お礼遅くなってすいません。mallocの使い方がわからなくて調べたりしてたら遅くなっちゃいました。
なんとか動きました。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# 100バイトのバイナリファイルを読み込んで別のファイルに書き込みたいのですが、型をどうすればいいのか 1 2022/11/03 17:11
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
Cでファイルの行数をカウントす...
-
構造体メンバの初期化
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
C言語で複数列のデータを1列の...
-
fread(),fwrite()等について
-
[C]セグメンテーションエラー:...
-
#defineが使用するメモリ領域に...
-
C++で指定文字列のカウント方法...
-
printf による16進表示について
-
fscanfの使い方
-
マイナスからプラスへ転じた時...
-
「指定されたキャストは有効で...
-
数字以外が入力されたらエラー...
-
C言語で簡単なパックマンゲーム...
-
比較回数と交換回数表示について
-
C言語での引数の省略方法
-
2÷3などの余りについて
-
4の倍数を論理演算で表す。。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
char型2つを結合し、short型に...
-
C言語でのCSVファイルの読み出...
-
矢印キーを押下してコンソール...
-
【C言語】全角文字の配列を、全...
-
エラーについて質問です。
-
リストの作成と出力(C言語)
-
バイナリファイル(画像)のよみ...
-
[C]セグメンテーションエラー:...
-
WinInetのInternetOpenUrl関数...
-
VC++でSQLへSELECT文を送ったの...
-
受信データから必要な部分のみ...
-
c言語で文書を読み込み、単語の...
-
reallocでエラー
おすすめ情報