昨日「windowsプログラムのデバッグ」で投稿させて頂いた者です。
要点は「どのようなときにfcloseがエラーをおこすか」です。
Windowsプログラムでバグを探したところデバッグ用のログ出力ファイルを
fcloseする時にエラーがおこりプログラムがエラーを起こして終了している
ことがわかりました。
プログラムを実行させて一定操作を行うと、プログラムの最後に行われるfcloseでエラーが起こります。
プログラムを実行させてそのまま(×等で)終了させたときにはエラーが起こらずに正常な書き込みがされているので、
メッセージの処理等をしている間に変な処理を入れてしまているのだと思いますが、
実際にログファイルへの書き込みはfcloseの直前までできているのでなぜエラーが起こるのかよくわかりません。
if((fp=fopen("log.txt","w")==NULL)return -1;
とやっているのでfopenは成功していると思います。
fcloseがエラーとなるのはどのような原因が考えられるのでしょうか。
「意味がわからないので~を説明しろ」等でも構いませんのでご回答お願いいたします。
【環境】
VC6.0++ProffessionalEdition
windows2000
【その他】
-エラー文の内容-
"0x77fcc465"の命令が"0xfffdfffa"のメモリを参照しました。
メモリが"read"になることはできませんでした。
No.1ベストアンサー
- 回答日時:
こんにちわ。
一つ確認させて下さい。
fclose の直後に、別の処理を追加してみて下さい。
→ 別のファイルにログを採取するようなものだけで結構です。
これで、log.txtのfclose が正常に動作するようであれば、
スタックを壊してしまっているために、異常なリターンアドレスに
復帰しようとした可能性が高いです。
→ 獲得したローカル変数に領域を越えてデータを読み込んで
しまった時等に、このようなエラーが発生する事があります。
(fclose の問題ではなく、呼び出し元の関数に復帰する時に
エラーとなった事が考えられます。)
スタック破壊の場合、問題の関数内の処理の一部をコメントアウトして、
エラーが発生するかどうかを調べると、比較的容易に問題の箇所を
特定できると思います。
この回答への補足
すみません。別の箇所でバグが発生してしまい
今確認ができない状態です。
申し訳ございません。
確認が済み次第お礼の欄に書かせて頂きます。
なお別のバグに関する質問を投稿させて頂きます。
よろしくお願いいたします。
No.3
- 回答日時:
>fclose((_iobuf *)0xffdffee));という事でしょうか。
ということです。
どんな引数を与えると、そのエラーが出るのか?を試した結果です。
ただ確認しただけで、あまり意味はありません。
さらに質問です。
・ちなみに、そのファイル処理は、一つの関数の中で完結していますか?
・それとも、ログファイル用のクラスがあって、そのコンストラクタ、デストラクタで、ファイルのオープン・クローズを処理していたりしませんか?
もし、後者の場合、クラスのコピーを考慮しないと、コピーのデストラクタで、ファイルがクローズされてしまい、オリジナルのデストラクタでの処理がエラーになる事があります。この場合、参照カウンタや、コピーフラグなどをクラスに持たせて、最後のインスタンス、もしくはオリジナルのみが、ファイルのクローズを行うようにする必要があります。
はずしていたら、ごめんなさい。
大変遅くなって申し訳ありません。
質問についてはちゃんと正しく処理がされていることを確認いたしました。
途中の箇所の修正をしているうちにこのバグにたどりつけなくなってしまった為返事が遅れてしまいました。
現在、ほとんど動くようになったのですがどうやらこのバグは発生しなくなりました。
どこかでミスってたのかもしれません。すみません・・。
だいぶ進んできたのですが更に謎のバグが発生したので更に投稿させて頂きます。
ありがとうございました。
No.2
- 回答日時:
ファイルポインタがどこかで書き変わってしまっていませんか?
もしくは、違うファイルポインタだったとか。
もしくは、別の場所で、すでに1度閉じられていたとか。
もしくは、ポインタをずらしてしまったとか。
あまり役に立つ情報ではありませんが、fclose()に、(_iobuf *)0xfffdffeeを引数として与えると、...が "0xfffdfffa"のメモリを参照... というエラーがでました。
この回答への補足
回答と質問ありがとうございます。
ファイルポインタは一つのみ。
fopen、fcloseともに一つずつです。
fprintf以外でファイルポインタの使用はしておりません。
おそらく以上の条件からこの点に置いてもんだいはないと
おもいます。ありがとうございます。
(_iobuf *)oxfffdffeeというのが何かわからないので
申し訳ございませんが説明をお願いいたします。
fclose((_iobuf *)0xffdffee));という事でしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
- Visual Basic(VBA) vbaエクセルマクロについて あるデータを作成し、デスクトップに.xlsx形式で保存するマクロを作成 2 2023/03/02 18:54
- Visual Basic(VBA) vbaエクセルマクロについて あるデータを作成し、デスクトップに.xlsx形式で保存するマクロを作成 6 2023/03/03 18:05
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) VBAのエラーについて 2 2023/08/02 17:46
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
ファイルクローズ(fclose)でエラーを発生させる方法
C言語・C++・C#
-
fopenでエラーとなる
C言語・C++・C#
-
fopne で失敗する原因
C言語・C++・C#
-
-
4
C言語のfopenについて教えてください。
C言語・C++・C#
-
5
fopen() がたまにNULLを返す
C言語・C++・C#
-
6
GDBデバッガの使い方について
C言語・C++・C#
-
7
fopenで別ディレクトリにファイルをオープンしたい
C言語・C++・C#
-
8
構造体のメンバをfor文で回したい
C言語・C++・C#
-
9
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
10
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
11
fopenでのパス指定
C言語・C++・C#
-
12
fclose()でセグメンテーション違反
C言語・C++・C#
-
13
Debug Assertion Failed?
C言語・C++・C#
-
14
#define _CRT_SECURE_NO_WARNINGS について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Returnに対するGoSubがありません
-
【COBOL】read文でエラー
-
「アクティブ ユーザーが多すぎ...
-
FTPの送信結果を検知したい
-
VBでファイルが開かれているか...
-
Access2010 コンパイルエラー...
-
エクセル VBA dll 読み込...
-
batファイルでレジストリキーの...
-
アクセスのクエリでコンパイル...
-
VB6 Dir関数で52エラー発生
-
イベントが発生しない vba
-
ExcelVBAで既に開いてるwordを...
-
FORTRANの実行エラーについて
-
RAR圧縮ファイル(分割)の順番が...
-
VB:「実行時エラー53 実行ファ...
-
gccを行ってもexeファイルが生...
-
ファイルクローズ(fclose)でエ...
-
fgets関数のEOFの扱い方について
-
[VBS]ファイルコピーで怪奇現象
-
freadでデータがない場合の読込...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBでファイルが開かれているか...
-
batファイルでレジストリキーの...
-
gccを行ってもexeファイルが生...
-
「パス名が無効です」の発生原因
-
Returnに対するGoSubがありません
-
アクセスのクエリでコンパイル...
-
NAS上のファイルの使用中が解除...
-
VBから参照できないCのDLLを使...
-
PowerShellを使って関連付けら...
-
Adobeのプレミアプロの書き出し...
-
EXCELのVBAでWORDが開いてある...
-
FTPの送信結果を検知したい
-
access テキストボックスの値取得
-
エクセルマクロでエラーの原因...
-
【COBOL】read文でエラー
-
VB6 Dir関数で52エラー発生
-
VBA ExecuteExcel4Macro 型が一...
-
Access2013にてドラッグ&ドロ...
-
freadでデータがない場合の読込...
-
ファイルクローズ(fclose)でエ...
おすすめ情報