• ベストアンサー

fcloseで発生するエラーについて。

昨日「windowsプログラムのデバッグ」で投稿させて頂いた者です。 要点は「どのようなときにfcloseがエラーをおこすか」です。 Windowsプログラムでバグを探したところデバッグ用のログ出力ファイルを fcloseする時にエラーがおこりプログラムがエラーを起こして終了している ことがわかりました。 プログラムを実行させて一定操作を行うと、プログラムの最後に行われるfcloseでエラーが起こります。 プログラムを実行させてそのまま(×等で)終了させたときにはエラーが起こらずに正常な書き込みがされているので、 メッセージの処理等をしている間に変な処理を入れてしまているのだと思いますが、 実際にログファイルへの書き込みはfcloseの直前までできているのでなぜエラーが起こるのかよくわかりません。 if((fp=fopen("log.txt","w")==NULL)return -1; とやっているのでfopenは成功していると思います。 fcloseがエラーとなるのはどのような原因が考えられるのでしょうか。 「意味がわからないので~を説明しろ」等でも構いませんのでご回答お願いいたします。 【環境】 VC6.0++ProffessionalEdition windows2000 【その他】 -エラー文の内容- "0x77fcc465"の命令が"0xfffdfffa"のメモリを参照しました。 メモリが"read"になることはできませんでした。

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 一つ確認させて下さい。 fclose の直後に、別の処理を追加してみて下さい。 → 別のファイルにログを採取するようなものだけで結構です。 これで、log.txtのfclose が正常に動作するようであれば、 スタックを壊してしまっているために、異常なリターンアドレスに 復帰しようとした可能性が高いです。 → 獲得したローカル変数に領域を越えてデータを読み込んで   しまった時等に、このようなエラーが発生する事があります。   (fclose の問題ではなく、呼び出し元の関数に復帰する時に   エラーとなった事が考えられます。) スタック破壊の場合、問題の関数内の処理の一部をコメントアウトして、 エラーが発生するかどうかを調べると、比較的容易に問題の箇所を 特定できると思います。

k_shin
質問者

補足

すみません。別の箇所でバグが発生してしまい 今確認ができない状態です。 申し訳ございません。 確認が済み次第お礼の欄に書かせて頂きます。 なお別のバグに関する質問を投稿させて頂きます。 よろしくお願いいたします。

その他の回答 (2)

  • isobeman
  • ベストアンサー率41% (17/41)
回答No.3

>fclose((_iobuf *)0xffdffee));という事でしょうか。 ということです。 どんな引数を与えると、そのエラーが出るのか?を試した結果です。 ただ確認しただけで、あまり意味はありません。 さらに質問です。 ・ちなみに、そのファイル処理は、一つの関数の中で完結していますか? ・それとも、ログファイル用のクラスがあって、そのコンストラクタ、デストラクタで、ファイルのオープン・クローズを処理していたりしませんか? もし、後者の場合、クラスのコピーを考慮しないと、コピーのデストラクタで、ファイルがクローズされてしまい、オリジナルのデストラクタでの処理がエラーになる事があります。この場合、参照カウンタや、コピーフラグなどをクラスに持たせて、最後のインスタンス、もしくはオリジナルのみが、ファイルのクローズを行うようにする必要があります。 はずしていたら、ごめんなさい。

k_shin
質問者

お礼

大変遅くなって申し訳ありません。 質問についてはちゃんと正しく処理がされていることを確認いたしました。 途中の箇所の修正をしているうちにこのバグにたどりつけなくなってしまった為返事が遅れてしまいました。 現在、ほとんど動くようになったのですがどうやらこのバグは発生しなくなりました。 どこかでミスってたのかもしれません。すみません・・。 だいぶ進んできたのですが更に謎のバグが発生したので更に投稿させて頂きます。 ありがとうございました。

  • isobeman
  • ベストアンサー率41% (17/41)
回答No.2

ファイルポインタがどこかで書き変わってしまっていませんか? もしくは、違うファイルポインタだったとか。 もしくは、別の場所で、すでに1度閉じられていたとか。 もしくは、ポインタをずらしてしまったとか。 あまり役に立つ情報ではありませんが、fclose()に、(_iobuf *)0xfffdffeeを引数として与えると、...が "0xfffdfffa"のメモリを参照... というエラーがでました。

k_shin
質問者

補足

回答と質問ありがとうございます。 ファイルポインタは一つのみ。 fopen、fcloseともに一つずつです。 fprintf以外でファイルポインタの使用はしておりません。 おそらく以上の条件からこの点に置いてもんだいはないと おもいます。ありがとうございます。 (_iobuf *)oxfffdffeeというのが何かわからないので 申し訳ございませんが説明をお願いいたします。 fclose((_iobuf *)0xffdffee));という事でしょうか。

関連するQ&A

  • fopen/fcloseでメモリリーク?

    Linux2.4系です。 Cプログラムでログファイルをフラッシュドライブ上のファイルに書き足していく処理があり、 デバッグテストで処理を高速に繰り返しながらコマンドラインのfreeコマンドでメモリ残量を 確認すると、かなり速いペースでキャッシュが減ります。 原因と対処法をご存じの方、おられないでしょうか? 処理は概ね以下のような感じです。 FILE *log_file; log_file = fopen( "../log/0001.txt" , "a+" ); fwrite( &text1, 1, sizeof(text1), log_file ); fclose( log_file ); 頻度は毎秒3回くらいで書き足すテキストは1kバイト程度です。 fwrite()を止めてもメモリ減少は止まらないですが、fopenとfclose を止めると減少しなくなります。

  • C言語のfopenについて教えてください。

    C言語のfopenについて教えてください。 ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。 そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか? 何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。 確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか? もし、エラーとなる場合、回避する方法がありますか? また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか? 読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。 よろしくお願いしますm(_ _)m

  • フォームの作成中にエラーが発生しました

    VS2010を使ってプログラムを作っております。 プログラムが完成し、知人のパソコン(windows Vista)にDebugフォルダを移しexeファイルを実行すると、スタートフォームまでは行けるのですが、別のフォームを開くボタンを押すと以下の様なエラーが出てしまいます。 「フォームの作成中にエラーが発生しました」 続行、終了と選択肢があり、続行を選ぶとスタートフォームのみ表示された状態になり、終了を押すと全て終了されてしまいます。 .NetFrameWork4は入れてあります。 作成したPCでデバッグしたり、Debugフォルダからexeを実行した時には何もエラーが出ず、そのDebugフォルダを他の場所に移し実行してもエラーは出ません。 原因の分かる方、おられましたらご教示願います。

  • acrobat readerで印刷できない(アプリケーションエラー:メモリが”writtenになることはできません)

    acrobat reader(version7)でPDFファイルを印刷を実行すると、下記のようなエラーメッセージが出ます。 acrobat readerを再インストールしても直りません。 対処法をお教えいただければと思います。 <エラーメッセージ> アプリケーションエラー “0x77fcc489の命令が”0x927293ccのメモリを参照しました。メモリが”writtenになることはできませんでした。プログラムを終了するには[ok]をクリックしてください。 どうぞよろしくお願いします。

  • fopenでディレクトリ内の全ファイルを順次開く方法

     UNIX上の/home/info/user/log内にある*.logファイルを一つずつfopenで開いて一行ずつ読み込み、用が済んだらfcloseで閉じていくようなプログラムを作りたいのですが、どうすれば良いのでしょうか?  最初はls -l /home/info/user/log/*.logをリダイレクトしたファイルリストを作り、それを読み込ませてfopen……という流れを考えていたのですが、対象となるファイルが万単位に登る為実現不可でした。  一行ずつ読み込ませる部分は既に出来ているので、fopen/fcloseに絞ってお教え下さい。

  • サービスアプリでのネットワークパスにあるファイルへのアクセス

    VC++6.0でサービスアプリケーションを作成しています。 ログファイルに出力する処理を入れたのですが、ローカルドライブだと問題なく出力されますが、ネットワークパスだと出力できません。 また、サービスとしてではなくダブルクリックでアプリを起動すると問題なく出力されるのですが、サービスの設定やプログラムの記述で何か処理を行う必要があるのでしょうか? ちなみに、ファイルへの出力は、fopen(),fputs(),fclose()を使用しており、fopen()でエラーになっているようです。 よろしくお願いします。

  • fopenでエラーとなる

    fopenを使用してログファイルへ書き込み時に、errno=13 Permission denied のエラーがまれに発生するときがあります。 ログファイルは、1ログを書く毎に、その都度、オープン/クローズしています。fopenの第二引数は"a+t"を指定しています。(テキストモード追加書き込み。+を指定している理由は、更新は行いませんが、Ctrl-Zの削除の為、+を指定することがマイクロソフトにより推奨されているため) もちろん、このログファイル(ディレクトリ含む)への書き込み権限がないということは、ありません。(あれば必ず発生しますので) 従って一時的に、書き込み不能となる状態が発生していると考えられます。エラーが発生した後も、一定の時間が経過した後には書き込めるようになります。 このような事象に遭遇したことのあるかたが、おりましたら、その旨回答下さい。又、解決方法(このような事態をさける方法)をご存じのかたがおりましたら、教えて下さい。 実行環境 Windows2003-server 開発環境 Visual Studio .NET 2003のC++による開発(コードの内容は実質的にC言語を使用、MFCは使用していません)

  • DOS窓の数値計算でエラーが出たり出なかったりします

    Windows98でVC6を使って,DOS窓のみで実行する数値計算(シミュレーション)のプログラムをデバッグ中です.「不正な処理.....」のエラーに対して,同じexeファイルを別のパソコン(windows98機)2台で実行させたところ,2台ともエラーが出ませんでした.ソースをUNIX機およびNT機に持って行ってコンパイル実行してもエラーが出ませんでした. こんな現象がなぜ生じるのか理解に苦しんでいます.CPUはPentiumII450MHz,メモリは128MBです. しかも, ・デバッグ用にprintf文を随所に入れると,正常動作しますし, ・逆に始めからある進行モニタ用のprintf文をコメントアウトしただけでも正常動作します。 ヒントとか,以前に似たような経験をされた方がいましたら,何でもお教えくだされば幸いです。

  • phpのlock処理について

    phpのlock処理について 頻繁に書き込みされるファイルが飛ばないようにロックをしているのですが、 (アクセスログを保存) phpのロック処理を調べていると 一方ではこれでよい、もう一方ではこれでは意味がないなど 色々な事が書かれており、いまいち理解できません。 wモードで開くと強固なロックは不可能なのでしょうか。 以下のようにしているのですが ロックの意味はないでしょうか。 //ロック専用ファイルを開く $flock=fopen("lock.txt","w"); //ロック専用ファイルをロック flock($flock,LOCK_EX); //書き込むファイルを連結して代入 $lineall = implode('', $lines); //書き込み用のファイルを開く $fp=fopen($log_file,"w"); fwrite($fp, $lineall); fclose($fp); //ロック用ファイルのロック解除 flock($flock, LOCK_UN); fclose($flock); プログラムが1から私が作成したものではなく、 ちょくちょく消えてしまうことからロック処理をしたいのと 処理の問題でwモードでの書き込みでないとどうもゴミが入ってしまうようですので (r+でやってみましたが空行などのゴミが沢山入ってしまいました) wモードでの強固なロック方法があればと思うのですが・・・。 お手数をおかけしますがご教授いただけますと幸いです。

    • ベストアンサー
    • PHP
  • エラー発生!?エラーの元がわかりません!!

    PCを立ち上げると同時に「Content Delivery Engine Component」というエラー発生のウィンドウが開きます。「エラー報告を送信する」をクリックして報告を完了してもまたすぐにこのウィンドウが開きます。 そこで「エラー報告に含まれるデータの参照」を開いて、「エラーに関する技術資料」を開いてみると、LOCALS~1\Tempフォルダの中にtxtが作成されていることがわかります。このウィンドウが開くたびにtxtファイルが増えていきます。 さらにこのエラーの影響だと思われるのですがPCをシャットダウンする際に「CDE.exe 初期化の失敗」というウィンドウが出ます。これは「OK」をクリックしても何度も出ます。しばらくすると、「プログラムの終了 - CDE.exe」が出ます。「すぐに終了」をクリックしても何も終了されずにまた出てきます。もうしばらくするとこのウィンドウに、このプログラムは応答していません。と表示されます。ここで「すぐに終了」をクリックすれば、やっとPCを終了することができます。 このエラーの原因も直し方もわかりません。どなたかわかる方がいれば教えてください。お願いします。