• ベストアンサー

ファイル出力時のエラーについて

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); }

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★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行以内を心がけています。 ・以上。参考に!

peroncho
質問者

お礼

お礼が大変遅くなりまして失礼いたしました。 とりあえず今回は何とか解決いたしました。 ご助言いただきましてありがとうございました。

その他の回答 (3)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

>セグメンテーションエラーは、これまでメモリアクセスの途中で 発生していたのですが、今回はファイルオープンの段階で発生しているようです。同じ名前のファイルがあるわけでもないのに、困惑していたところです。 この状況から察するに、提示された以外の部分(2000ステップの未提示部)でメモリの破壊を行っている可能性が高いです。 セグメンテーションエラーでcoreを吐くと思いますので、それをデバッガで追えば、メモリ破壊の手がかりがつかめるかもしれません。 そういう意味では、使用OS、コンパイラの情報も提示されると、良い回答がえられるかもしれません。

peroncho
質問者

お礼

お礼が大変遅くなりまして、失礼いたしました。 デバッガを使用したことがありませんでしたが、 今回を期に今後は使いたいと思います。 ご助言に感謝します。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

全ソースを提示して下さい。これだけだと、正しいようにおもわれます。 たとえば、iに0を設定してから、while(i<100)を実行していると信じたいのですが、i=-1000;等もしくは、iを初期化していない状態で、while(i<100)に突入すると、かなりのループをしますし、data[i]で、dataが破壊されます。そのような不信感をすべて取り除くには、全ソースを公開して下さい。それも、タイプミスを防ぐため、転記ではなく、ソースをコピーして、張り付けて下さい。

peroncho
質問者

お礼

早速ご指摘いただきましてありがとうございます。 iについては確認しましたが問題なさそうです。 このソースファイルは2000行近くになっておりますので、 すべてを記載するのは困難ですね。 セグメンテーションエラーは、これまでメモリアクセスの途中で 発生していたのですが、今回はファイルオープンの段階で発生しているようです。同じ名前のファイルがあるわけでもないのに、困惑していたところです。 もし同じようなご経験をお持ちであれば教えてください。 取り急ぎお礼まで。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★謎です。 ・ソースを見たかぎりでは、特に問題は無いように見えますが、変数の宣言部も見ないと正しく  原因を推測できませんね。 ・とりあえず下のソースで実行してみて下さい。 サンプル: 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 );  } } 最後に: ・上記のソースでエラーが出るかどうか試して下さい。 ・あと変数の宣言なども補足してくれますか? ・以上。

peroncho
質問者

お礼

早速のご回答ありがとうございます。 提示していただいたソースは、問題なく実行されました。 実は、質問文のソースだけなら問題なく実行できるのですが、 すべてのプログラムを実行すると、"aaaaa"を出力後、 "bbbbb"が出る前に止まってしまいます。。。