CStdioFileでエラーが出る(CFileではOK)ファイルオープン時のエラー

[戻る]
りょくちゃ 2005/05/17(火) 19:03:34
はじめまして りょくちゃと申します。

テキストファイルを開いて、テキストを1行毎に読むソースの一部なんですが、
CStdioFileでファイルオープンするとエラーになり、CFileを使うとすんなりファイルが
開けます。

エラーはファイルオープンダイアログ後に「XXX.txtへのアクセス中にディスクがいっぱ
いになりました。」というメッセージが出ます。

1行ごとに判定を行って読み込みを行いたいので、CStdioFileのReadStringを使用したい
ところなんです。

何故CStdioFileでエラーが起こるか解りません。
エラーの原因と対処法のヒントを頂けたらと思い投稿しました。
どうぞよろしくお願いします。

--------以下のソースで(*)のクラスを「CFile」にするとOK--------
(*)CStdioFile    dxFile ;
CString        dxName ;

CFileDialog dlg( TRUE,
        ".txt",
        NULL,
        OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
        "text(*.txt)|*.txt||",
        this ) ;

if( dlg.DoModal() == IDOK )
 dxName = dlg.GetPathName() ;

dxFile.Open( dxName, CFile::modeRead | CFile::typeText ) ;
fcloseall();

りょくちゃ 2005/05/17(火) 19:06:30
再び投稿主のりょくちゃです。
開発環境を書き忘れました。
 WinXP、VisualC+6.0、MFC

です。 以上です。

Blue 2005/05/17(火) 19:15:51
>CStdioFileでファイルオープンするとエラーになり、CFileを使うとすんなりファイル>開けます。
開くファイルのサイズはどの程度でしょうか?
あまりサイズが大きいとCStdioFileのOpen処理で_fdopenを使っているので
NGの場合があります。

Blue 2005/05/17(火) 19:27:30
_open_osfhandle使っているが原因なのかな。
_fdopenまで行くと開けるかも。。。

一度デバッグで追っかけてみてはどうでしょうか?

りょくちゃ 2005/05/17(火) 19:33:13
Blueさま、早速のチェックありがとうございます。

試しに小さいファイル(2byte文字を記述した2行のみのファイル(1KB))を
作成してテストしたのですが、これでもエラーが出てしまいました。

_fdopen周辺を調べてみます。

Blue 2005/05/17(火) 19:38:21
>エラーはファイルオープンダイアログ後に「XXX.txtへのアクセス中にディスクがいっ>いになりました。」というメッセージが出ます。
のエラーはどのように取得していますか?
try〜catchで捕まえたCFileExceptionに対してでしょうか?

それとそのファイルを別のところで開いたりはしていませんか?

Wakyu 2005/05/20(金) 19:46:02
CStdioFileのコンストラクタで試してみてはどうでしょうか?
CStdioFile(
   LPCTSTR lpszFileName,
   UINT nOpenFlags 
);

Blue 2005/05/21(土) 00:57:33
>CStdioFileのコンストラクタで試してみてはどうでしょうか?
Openと同じですよ。
以下MFCソース
>CStdioFile::CStdioFile(LPCTSTR lpszFileName, UINT nOpenFlags)
>{
>    ASSERT(lpszFileName != NULL);
>    ASSERT(AfxIsValidString(lpszFileName));
>
>    CFileException e;
>    if (!Open(lpszFileName, nOpenFlags, &e))
>        AfxThrowFileException(e.m_cause, e.m_lOsError, 
>e.m_strFileName);
>}

結局try〜catchで捕まえてみないとよくわからないと。

うちだ 2005/05/23(月) 11:32:57
さぜ、「fcloseall()」を使うのでしょうか?

---------------------------------------------------
CStdioFile    dxFile ;
CString        dxName ;

CFileDialog dlg( TRUE,
        ".txt",
        NULL,
        OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
        "text(*.txt)|*.txt||",
        this ) ;

if( dlg.DoModal() == IDOK )
 dxName = dlg.GetPathName() ;

dxFile.Open( dxName, CFile::modeRead | CFile::typeText ) ;
dxFile.Close();
---------------------------------------------------
なら上手くいくと思いますが
CStdioFile::Close()
を使わない理由は何???

古いスレッドには追加発言できません。