• 締切済み

CFileのOpenで例外(998:メモリ ロケーションへのアクセスが無効)

【環境】WindowsXP、VS2005++、MFC タイトルの通りなんですが、CFileのOpen時に例外が発生してしまいます。 CFile file; LPCSTR output; file.Open(output, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite); 関数Aに記載しており、何度かその関数を呼ぶと、決まったタイミングで例外が発生します。 GetLastErrorで998が返ってきている事は分かったのですが、 どう解決すれば良いのかわかりません・・・。 ちなみにopenしているのはBMPファイルです。 以上、ご教授お願いいたしますm(__)m

  • ya-cha
  • お礼率68% (184/268)

みんなの回答

回答No.1

>何度かその関数を呼ぶと、 という部分から調べてみるしかないですね。 エラーの発生条件としては大きなものは、メモリ確保されていない部分へのアクセスですから ・関数内で使用しているメモリ(変数)確保の状況(適せさなサイズがあるか等) ・関数に渡しているメモリアドレスの有効サイズ 等、 あとオープンはいいですが、クローズもしてますか?

ya-cha
質問者

お礼

ご回答ありがとうございます。 色々調べて、メモリの確保の方法がおかしく、ヒープがぐちゃぐちゃになっていたのが原因でした。 ありがとうございましたm(__)m

関連するQ&A

  • ファイルの書き込みOpen中に、読み込みOpen

    VS2010 MFC VC++環境で悩んでいます。 書き込みOpen if(!log_d.Open(pszFileNameLog, CFile::modeCreate | CFile::modeWrite, &eerr)){ 中に、同じプロセスで読みこみOpenができません。 if(!log_d.Open(pszFileNameLog, CFile::modeRead, &err)){ 矛盾することは分かっているのですが、できる方法があれば と思っています。 どなたかご存知の方おられましたら、よろしくお願いいたします。

  • CFileのReadでの例外エラー#38が発生

    お世話になります。 Visual Studio2005にてC++のプログラムを作成しており、プログラム内で作成したcsvファイルをプログラム起動時に読み込むような動作を行っております。 そこで、件名のとおりの症状が発生しております。 具体的な症状としましては、csvファイルをCFileのメンバ関数Read()で読み出しているのですが、ファイル内の特定の箇所を読み出そうとしたときに、例外エラーが発生し、エラー番号を確認したところCFileException::m_IOsErrorが”38”となっていました。 ネットで調べたところ、エラー番号38はEOFエラーらしいのですが、普通EOFが見つかったのであればCFile::Read()の場合例外エラーは発生しないかと思います。また、msdnで調べたところファイルを非同期で読み込んだ場合には発生するような事が記載されておりましたが、CFile::Open時に非同期指定にはしておらずデフォルトの指定でファイルを開いております。 また、件のcsvファイルをOS上でコピー&ペーストをしようとすると、「エラー番号38により、データがコピーができない」といった警告文が表示され、コピーすることも出来ません。 このcsvファイルが破損した為なのかな?とは思っているのですが、そのはっきりした原因がわからずどうしたものかとはまっております。 もし同じ症状にあわれた方、対処方法をご存じの方がいらっしゃいましたら、情報を提供頂ければと思っております。 よろしくお願い致します。 開発環境) Windows CE 6.0 Visual Studio 2005

  • 【MFC】CFileでSeekした位置から値出力したい

    【MFC】CFileでSeekした位置から値出力したい 環境:WindowsXP(SP2)、VisualStudio2005、MFC CFileの「open」を利用して、ファイルをオープンし、 (この時の指定モードはCFile::modeCreate | CFile::modeNoTruncate | CFile::modeWriteです) 指定した位置にseekし、そこへCFileの「Write」で書き込みを行っています。 Seek位置を「SeekToEnd()」で最後へ移動した際は問題ないのですが、途中へSeekし、書き込みを行った際に、そこから上書きされてしまいます。 「挿入」という形で途中にデータを書き込む方法は無いでしょうか? ※特にMFCにこだわっているわけではないので、何かご存知の方がおられましたらご教授お願いいたしますm(__)m

  • ファイルへの書き込み処理について

    C++の処理で分からないことがあります。 アドバイスを頂けますようよろしくお願い致します。 以下のプログラムがある場合、 どのような時にエラー処理が実行されるのでしょうか? 例えば、書き込み対象のファイル「C:\WORK\20060508.txt」が既に秀丸等で開かれている状態でもエラーは発生するのでしょうか? TRY { CFile file(strLogFilePath, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate); file.SeekToEnd(); file.Write(strText, strText.GetLength()); file.Close(); } CATCH(CFileException, e) { // エラー処理 } ※補足 strLogFilePath=C:\WORK\20060508.txt strText=テストです。

  • DLLでの例外処理(CException)

    Windows2000上でVC++6.0を使用し、DLLを作成しています。 (AppWizardのWin32DLL/単純なDLLプロジェクトより作成) その中のファイルアクセス時の例外処理で例外が起こっていて、 原因がわからず、困っています。 どなたかおわかりになれば助けてください。 CFileException ex; m_fp = new CStdioFile; if ( ! m_fp->Open( (LPCTSTR)m_csFileName,  //ファイルオープン   CFile::modeWrite    |        // 読み書き両用   CFile::modeNoTruncate |         // 切り捨てなし   CFile::modeCreate   |          // 新規作成(切り捨てなし)   CFile::typeText    |          // テキスト モード   CFile::shareExclusive ,         // 排他モード   &ex ) ) {                 // 例外     ex.ReportError( MB_OK | MB_ICONEXCLAMATION, 0 ); //エラーメッセージダイアログ表示     delete m_fp;     m_fp = NULL;     return FALSE; } の、CExceptionクラスのReportError関数の中でアサーションエラーが起きているようです。 深いところまで追っていくと、AfxLoadString(nIDS, szFormat)で、 このIDのメッセージリソースが見つからず、メッセージが空のため、アサートで引っかかっている模様。 そもそも、DLLでAfx~系の関数って使えるのでしょうか? 使えないのであれば、例外時のエラーメッセージをとってくる方法が他にあるでしょうか? 申し訳ありませんが、よろしくお願いいたします。

  • CFile Openで開いたファイルに書き込み場所をしていしてWriteする

    現在、ファイルに書込む処理を施しています。 現在、以下のようなところまでいきました。 CFile file; file.Open(ファイルのフルパス, 書込みモードで開く); block bc; // グローバルで宣言した構造体 /* なお、この中には struct block { int x; int y; }; */ があります。 そして、それを bc.x = 1; // '1'は例 bc.y = 1; // 同上 とするのですが、これではどのファイルに書き込むか、ということがわからないのでイメージとしては file.bc.x(y)としたいです。 こうするにはどうすればよいのでしょうか? ご教授のほどよろしくお願いいたします。

  • MFCを使うための約束事は?

    MFCをつかって、ファイルが存在しているかチェックする プログラムを作ったのですが、上手くいきません。 test.cppは以下のように書いています。 #include "test.h" int _tmain(int argc, _TCHAR* argv[]) { CFile f; CFileException e; if( !f.Open(argv[1], CFile::modeCreate | CFile::modeWrite, &e)) { return 0; } else { f.Close(); return 1; } } test.hは以下のように書いています。 #pragma once #include <afxwin.h> #include <afxext.h> #include <afxole.h> #include <afxdisp.h> どなたかご教授下さい。

  • 画像の保存方法。

    VC++のMFC、ダイアログベースで画像処理のソフトを開発している者です。 ピクチャーコントロールに画像を表示させて、その画像を保存したいと思っています。 保存用のダイアログを開き、名前を付けて保存したいのですがうまくいきません。 下が今作っているプログラムです。 void Cstart2Dlg::OnBnClickedButton10() { CFileDialog myDLG(FALSE,"BMP","*.BMP", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "画像(*.BMP)|*.BMP||"); if(myDLG.DoModal() == IDOK){ CStdioFile fout(myDLG.GetPathName(),CFile::modeCreate |CFile::modeWrite|CFile::typeBinary); UpdateData(TRUE); fout.WriteString(m_pict8); fout.WriteString("\xla"); filename = myDLG.GetPathName(); SetWindowText("start2"+filename); } ピクチャーコントロールの変数をm_pict8にしています。テキストファイルを保存するプログラムを参考にして作っているので間違っているのだと思います。 画像の保存方法が分かる方がいらっしゃいましたらよろしくお願いいたします。

  • ファイルのオープンについて

    いつもお世話になっています。 MFCを使ってのファイルの作成についての質問です。 ファイル名を引数としてそのファイルを作成したいのですが、ファイル名には"\","/"など使えない文字が存在します。 その文字が入ったていたら、falseを返すようにしたいのですが、どんな関数を使用すればいいのでしょうか? 今は指定された作成されたファイルをオープンするときに fileName.Open(FileName,CStdioFile::modeCreate|CStdioFile::modeWrite|CStdioFile::modeNoTruncate) のように開いてますがエラーにならず書き込みの時にエラーとなります。 作成時にエラーを出すにはどうしたらいいのでしょうか? よろしくお願いします

  • プラスが文字化け

    開発環境 ・Windows XP (32bit) ・Visual C++ 2005 ・マルチバイト文字セット CStdioFileクラスを使用してのファイル出力で、 以下のような処理を実行したところ文字化けしてしまいました。 文字化けを回避するにはどうすれば良いでしょうか? アドバイスお願いします。 CStdioFile file(_T("C:\\XXX\\YYY.txt"), CFile::modeCreate | CFile::modeWrite); // "+"の後ろが数値となる文字列 CString str(_T("0.000e+000")); file.Write(str, str.GetLength()); ↑の実行結果をエディタで開くと"0.000eMモ"となってしまいます。

専門家に質問してみよう