• ベストアンサー

閉じてないファイルについて

Visual C++ 2010 Expressで、開いたら閉じなければいけないファイルやハンドルを閉じないでプログラムを終了した場合に、閉じていないファイル名やハンドル名を確認するにはどうすればいいですか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

>ほとんどの入門書ではプログラム終了直前に必ず開いたハンドルを閉じるように書かれているのですが・・・。 後始末を習慣づけるためだと思います。 ただ、「終了直前に閉じる」と書いてるとしたら、良くない本です。「使い終わったら閉じる」というのが正しい考え方です。 1つのプロセスから同時にオープンするファイル数には上限があるので、何十ものファイルを順次読んでいくプログラムの場合、読み終わった段階で閉じないと、そのうち上限に達して開けなくなります。 習慣づけ以外としては、読む人に、「これ以降はこのファイルを使わない」という情報を与えるためです。「変数のスコープはできるだけ狭くすべき」というのと同じですね。 また、プロセス外の共有資源(セマフォなど)をカーネルに依頼して確保したようなケースだと、これはプロセスが終了しても(プロセスの外なので)自動的に解放されないので、明示的に解放が必要なはずです。

nazoda
質問者

お礼

分かりやすい回答ありがとうございました。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

プログラムを終了してしまうと、全部クローズされるので調査不能です。 終了で無く、1時間スリープとかするようにして、その間に、オープンされているファイルを調べるくらい。 調べる方法としては、openfilesコマンド、process monitorプログラム など。

nazoda
質問者

補足

回答ありがとうございます。 プログラムを終了すると全部クローズされてしまうならば、なぜわざわざハンドルを閉じなければならないのでしょうか? ほとんどの入門書ではプログラム終了直前に必ず開いたハンドルを閉じるように書かれているのですが・・・。

関連するQ&A

  • ダイアログボックスのサイズの違い

    ResEditを使いwidthを306に設定してダイアログボックスを作成したのですが、プログラム中にGetWindowRect関数を使い、そのダイアログボックスの横幅を調べてみると542という値が返されました。どうしてこのような違いが出るのでしょうか? また、両方の数値を一致させるにはどうすればいいですか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • トラックバーをクリックした時のつまみの位置について

    トラックバーのつまみ以外の場所をクリックするとマウスカーソルの位置に関係なく、ページサイズで設定されている量だけつまみが移動するようですが、 クリックした位置につまみを移動するにはどうすればいいですか? (ダイアログベースのプログラムでダイアログに横向きのトラックバーを貼り付けている場合) --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • VisualC++2010Expressでのエラー

    Visual C++ 2010 Expressでエラーもなく、正常にビルドされたプログラムを終了した時に出力ウィンドウに 「テストプログラム.exe の 0x6b6b4444 で初回の例外が発生しました: 0xC0000005: 場所 0x00256a40 を読み込み中にアクセス違反が発生しました。 プログラム '[6396] テストプログラム.exe: ネイティブ' はコード 0 (0x0) で終了しました。」 というメッセージが表示されるのですが1行目にあるメッセージの意味がよく分かりません。プログラムそのものは途中で止まることなく動いています。 すべてのプログラムでこのメッセージは表示されます(Visual C++ 2010 Expressが自動生成したコードだけのプログラムでも)。 原因はウィルスチェックソフトが起動していることだというところまではわかったのですがアクセス違反を起こしたのはVisual C++ 2010 Expressの方なのかウィルスチェックソフトの方なのかよく分かりません。 それを調べる方法はないのでしょうか? また、このメッセージを無視して実行し続けていたら何か問題が発生することはあるのでしょうか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C++

  • 表示中のホームページのURLを取得するには?

    Visual Studio 2010 ExpressでWIN32プロジェクトを選択して作成した、フォームだけのプログラムを起動。 その後、インターネットエクスプローラーを起動し、いろいろなホームページを見る。 ページが切り替わってURLが変わるたびに、自分が作成したプログラムのクライアント領域にそのURLが表示される。 というプログラムを作りたいのですが、インターネットエクスプローラーから、表示中のURLを取得する方法がわかりません。 URLを取得する方法を教えてください。 --- 実行環境 --- インターネットエクスプローラー9 Visual Studio 2010 Express WIN32 ユニコードビルド C言語

  • トラックバーのつまみを動かせない

     トラックバーの範囲を設定するときに最大値を98304以上にするとトラックバーのつまみを動かせなくなるのですが、これはトラックバーの仕様なのでしょうか?  これ以上の値を設定しても正常に動かす方法があったら教えてください。 <最大値の設定部分> InitCommonControls(); SendMessage(hbar,TBM_SETRANGE,TRUE,MAKELPARAM(0,98304)); --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • 最初に押されたキーを調べるには?

    下のプログラムではCTRLを押しながらAを押しても、Aを押しながらCTRLを押してもメッセージボックスが表示されます。 これをCTRLを押しながらAを押した場合だけメッセージボックスを表示するように変えたいのですが、2つのキーが押されている時に最初に押されたキーを調べる方法がわかりません。 どうすればいいでしょうか? case WM_KEYDOWN: if( (GetKeyState(VK_CONTROL)<0) && (GetKeyState(0x41)<0)){ MessageBox(hWnd,TEXT("CTRL+Aが押されました。"),TEXT("テスト"),MB_OK); } --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • プログラム実行中にプログラムを書き換えるには?

    実行中のプログラムの中でそのプログラムの一部を書き換えて保存するにはどうすればいいですか? 例えば次のようなプログラムの場合、このプログラムの中でTEXT("最初の文字列");の部分の文字列を別な文字列に変更しプログラムを更新したいです。 (プログラム終了後にもう一度実行すると「moji[20]=」の部分は前回実行時に書き換えた文字列が代入されているようにしたい) #include<windows.h> int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int ncmdshow){ TCHAR moji[20]=TEXT("最初の文字列"); MessageBox(NULL,moji,TEXT("文字列表示"),MB_OK); return 0; } --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • UTF-8での保存について

     エディットボックスに入力してある日本語の文字列をUTF-8やUTF-8Nでテキストファイルに保存したのですがうまくいきません。  UTF-8の場合はファイルの先頭に3バイトのBOMをつければいいらしいので、 ファイルの先頭に0xEF,0xBB,0xBFの3バイトを追加してテキストファイルに保存しましたがメモ帳で開くと文字化けします(メモ帳で開くときは文字コードをUTF-8にして開いてます)。 作成したテキストファイルをバイナリエディタで開いてみると先頭の3バイトはEFBBBFとなっているので何も問題はないと思うのですが、どうして文字化けするファイルができてしまうのでしょうか? --- 実行環境 --- Microsoft Visual C++ 2010 Express WIN32 ユニコードビルド C言語

  • MicrosoftVisualC++2010エラー

    学校でC言語を習っているので家でもやろうと思ってMicrosoft Visual C++ 2010 Expressをインストールしました。 取りあえず本を読みながら、プログラムを書いていたのですが、3個目くらいのプログラムを実行(デバッグなしで開始)したら、「ビルドエラーが発生しました。続行して、最後に成功したビルドを実行しますか?」というエラーが出てきて、実行できませんでした。 (はいを押すと、指定されたファイルが見つかりませんと出てきます。) しかも、前に書いたプログラムまで、実行したらそのメッセージが出るようになりました。 一応実行してエラーが出たプログラムも書いておきます。 #include <stdio.h> int main (void) { printf("こんにちは\n"); printf("さようなら\n"); return (0); } 原因がわかりません。 どなたかご教授願います。

  • Visual C++ 2010 Expressについて質問です

    Visual C++ 2010 Expressについて質問です Visual C++ 2010 Expressを用いてopenCVを使ったプログラムを作成したいと考えています そこで、インクルードファイルの設定やライブラリファイルの設定を以下のサイトの通りにしたのですが http://d.hatena.ne.jp/blono/20100501 うまくいきません Visual C++ 2008 Expressでは通っていたものをコピーしてビルドしたところ デバッガをVisual Studio 2005のものを使われようとしていました 上記のサイトではWin32プラットフォームアプリケーションにする場合とありましたが Win32コンソールアプリケーションで実行させたい場合にはどうしたらよいでしょうか? 言葉足らずだとは思いますがよろしくお願いします

専門家に質問してみよう