• ベストアンサー

ファイルの入出力について教えてください。

初心者です。よろしくお願いします。 私は今、ErgoVista(EarthView)というソフトで画像を表示するために、datファイルを入力して、x00ファイルを出力するプログラムを作っています。datファイルをエディタで表示すると2行45万列の複素データが出てきます。 とりあえず何の処理もせず、ErgoVistaファイル入出力の例から、下のようなプログラムを作ったのですが、実行ができなく 「unknown software exception(0xc00000fd)がアプリケーションの0x00401997で発生しました」と出てきました。 初心者でして、なんで実行ができないのかまったくわかりません。誰か教えてください。 下のソースファイルで間違っているとこがありましたら、教えてもらえると幸いです。 #include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> void Make_Header(char*,int,int); //ヘッダファイル書き出し関数,このまま使用 #define T 451584 main() { /*変数宣言*/ int i; long j; double data1[2][T]; FILE *fp_i, *fp_o; /*入力*/ printf("data in start\n"); fp_i = fopen("200113-HH-100a-IFFT.dat", "r"); for(j = 0; j < T; j++){ for(i = 0; i < 2; i++){ fread(&data1[i][j],sizeof(double),1,fp_i); } } //fread(代入する変数ポインタ,データ型サイズ,データ数,fp_i); fclose(fp_i); //開いたらちゃんと閉じる /*************************************** 処理部分 ***************************************/ /*出力*/ printf("write in start\n"); fp_o = fopen("200113-HH-100a-IFFT1.x00", "wb"); //ファイルオープン,wbはオープン形式でバイナリファイル書き出し fwrite(&data1[i][j],sizeof(double),1,fp_o); //出力部分,ループでまわしたり fclose(fp_o); //開いたらちゃんと閉じる Make_Header("200113-HH-100a-IFFT1.x00",2,T); //ErgoVistaのヘッダファイル情報を出力する関数,?pixel(横数)とline(縦数)を出入? return 0; } /* ヘッダ情報書きこみのサブルーチン このまま使用*/ void Make_Header(char FN[], int pixel, int line) { char hd[40]="", text[40]; FILE *fhd; strncat(hd, FN, strlen(FN)-3); strcat(hd, "hdr"); if((fhd = fopen(hd, "w")) == NULL){ printf("error : cannot open [%s] (header file)\n", FN); exit(1); } fprintf(fhd, "FILE_TYPE = IMAGE \n"); fprintf(fhd, "IMAGE_LINES = %d \n",line); fprintf(fhd, "LINE_SAMPLES = %d \nEND\n",pixel); fclose(fhd); }

質問者が選んだベストアンサー

  • ベストアンサー
  • min_is
  • ベストアンサー率25% (1/4)
回答No.3

いくつか気になる点 1. 配列が大きすぎだとおもいます。 他の方もおっしゃっていますが、malloc などで動的に確保してみ てください。 (これが原因ならスタックオーバーフローとかになりそうですが) またTの値が size_t 型で表現可能なら static 宣言でも動くかもしれ ません。 2. 入力時fopenにバイナリ指定がありません。 3. 出力時に使用する iとj は 実際に使用するときには、再度 0 に設定していますよね? 4. Make_Headerの仮引数 lineは int 型で宣言していますが、入力時 のループカウンタは long で宣言しています。 お使いのコンパイラが、もしint型が4バイト未満だったら、 うまく動かない可能性があります。

andre07
質問者

お礼

多くのご指摘助かります。 すいません、3.の出力時に使用するiとjは、再度0に設定するというのがよくわかりません。

その他の回答 (2)

回答No.2

1つ疑問なのですが、一気に全部読みこまないと処理できないのでしょうか?(これは私にはわかりませんので) 数KB バイト位に切り分ければ、 動的に用意しなくても処理できると思いますよ。 あと下の方がおっしゃるように配列サイズが大きいですが、 7.2MBくらいなら処理できそうな気がします。 (やってないので分りませんが・・・) プログラムにミスがないかどうかも確認した方がいいと思います。

andre07
質問者

お礼

切り分けたりできるのですね。 すいませんまだ初心者なのでそんなことができるなんて知りませんでした。 勉強してやってみます。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

> double data1[2][T]; 8×2×45万=7.2MB こんな巨大な領域を自動変数にしてはいけません。 malloc()で動的に確保しましょう。

andre07
質問者

お礼

ありがとうございます。 まだ初心者で、これからmalloc()について勉強しようと思います。

関連するQ&A

専門家に質問してみよう