- ベストアンサー
ファイル出力時のエラーについて
wileのループの途中で、バイナリのファイルを出力しているのですが、しばらくはファイルを出力してくれるものの、毎回決まった回数 ループが回ると、セグメンテーションエラーで止まってしまいます。 症状としては、以下のようなプログラムを実行すると、しばらくは問題なく処理されるのですが、ループの途中で、 aaaaa"の表示の後、"OPEN FAILED"の表示はないまま、 "bbbbb"が表示されるまえに、エラーで止まってしまいます。 原因がよくわかりません。どなたか、原因が推測できる方が おられましたら教えてください。 よろしくお願いします。 (OSはwindowsXP,コンパイラはgccを使用しております。) while(i<100){ i++; data[i] = i; sprintf(file,"file_%d",i); printf("aaaaa\n"); if((fp=fopen(file,"wb")) == NULL) { printf("OPEN FAILED %s\n", file); exit(0); } printf("bbbbb\n"); fwrite(data, sizeof(short), 100, fp); printf("ccccc\n"); fclose(fp); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★2000行もあるのならば、デバッグを行って下さい。 ・まず、全ソースを丸ごと別フォルダにコピーします。 そして、すべてのサブ関数を取り外します。 その後に while 文に関わる関数を1つ1つ記述していき、セグメント・エラーを起こす関数を 突き止めて下さい。おそらく、このようなエラー(バグ)がまだ隠れていて、それが原因となって ファイルの入出力管理のメモリも破壊しているのではと思います。 ・2000行のソースを見直すのは大変ですが、一度、新規作成して1つ1つの関数を追加して行く やり方で原因が早ければ1日(6~8時間)で見つかります。また、それぞれのサブ関数の見直しも した方が良いでしょう。→引数、戻り値、処理を明確にするなど。 ・サブ関数は、ちょっとした関数マニュアルを作成して、その記述を元に新規作成します。 サブ関数のソースを覗いて動作を探るようにはしないで下さい。→関数の処理を明確にすること。 余談: ・昔、MS-DOS 時代に優れたフリーソフトがあり、Cソースもあったので覗いた事がありました。 とても優れた(私が初心者時代の)ソフトでCソースのかなりすっきりとした綺麗な記述だと思って 期待して覗いたのです。ところが、main 関数だけで記述されていてサブ関数が1つもありません でした。さらに main 関数の行数が 1000 行以上もあってかなりショックでした。 後にも先にも main 関数だけで 1000 行以上の記述されたソースは、それ1つでした。 ・よって、分かりやすく関数に分割する良いお手本(反面教師)となりました。 2000 行のソースも当然、複数のサブ関数から構成されていると思いますが、1関数では最大でも 50 行以内に収まるよう記述するようにしましょう。→私は 50行以内を心がけています。 ・以上。参考に!
その他の回答 (3)
- tatsu99
- ベストアンサー率52% (391/751)
>セグメンテーションエラーは、これまでメモリアクセスの途中で 発生していたのですが、今回はファイルオープンの段階で発生しているようです。同じ名前のファイルがあるわけでもないのに、困惑していたところです。 この状況から察するに、提示された以外の部分(2000ステップの未提示部)でメモリの破壊を行っている可能性が高いです。 セグメンテーションエラーでcoreを吐くと思いますので、それをデバッガで追えば、メモリ破壊の手がかりがつかめるかもしれません。 そういう意味では、使用OS、コンパイラの情報も提示されると、良い回答がえられるかもしれません。
お礼
お礼が大変遅くなりまして、失礼いたしました。 デバッガを使用したことがありませんでしたが、 今回を期に今後は使いたいと思います。 ご助言に感謝します。
- tatsu99
- ベストアンサー率52% (391/751)
全ソースを提示して下さい。これだけだと、正しいようにおもわれます。 たとえば、iに0を設定してから、while(i<100)を実行していると信じたいのですが、i=-1000;等もしくは、iを初期化していない状態で、while(i<100)に突入すると、かなりのループをしますし、data[i]で、dataが破壊されます。そのような不信感をすべて取り除くには、全ソースを公開して下さい。それも、タイプミスを防ぐため、転記ではなく、ソースをコピーして、張り付けて下さい。
お礼
早速ご指摘いただきましてありがとうございます。 iについては確認しましたが問題なさそうです。 このソースファイルは2000行近くになっておりますので、 すべてを記載するのは困難ですね。 セグメンテーションエラーは、これまでメモリアクセスの途中で 発生していたのですが、今回はファイルオープンの段階で発生しているようです。同じ名前のファイルがあるわけでもないのに、困惑していたところです。 もし同じようなご経験をお持ちであれば教えてください。 取り急ぎお礼まで。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★謎です。 ・ソースを見たかぎりでは、特に問題は無いように見えますが、変数の宣言部も見ないと正しく 原因を推測できませんね。 ・とりあえず下のソースで実行してみて下さい。 サンプル: char file[ 256 ]; short data[ 100 ] = { 0 }; FILE *fp; int i; for ( i = 0 ; i < 100 ; i++ ){ data[ i ] = (i + 1); sprintf( file, "file_%d", i ); printf( "aaaaa\n" ); if ( (fp = fopen(file,"wb")) != NULL ){ printf( "bbbbb\n" ); fwrite( data, sizeof(short), 100, fp ); printf( "ccccc\n" ); fclose( fp ); } else{ printf( "OPEN FAILED %s\n", file ); exit( 0 ); } } 最後に: ・上記のソースでエラーが出るかどうか試して下さい。 ・あと変数の宣言なども補足してくれますか? ・以上。
お礼
早速のご回答ありがとうございます。 提示していただいたソースは、問題なく実行されました。 実は、質問文のソースだけなら問題なく実行できるのですが、 すべてのプログラムを実行すると、"aaaaa"を出力後、 "bbbbb"が出る前に止まってしまいます。。。
お礼
お礼が大変遅くなりまして失礼いたしました。 とりあえず今回は何とか解決いたしました。 ご助言いただきましてありがとうございました。