ども、最近毎日質問している
いけやんです。
CStdioFileの事でエラーが出て困っています。
開発環境
WinXP Pro
Visual C++6.0
MFC ダイアログベース
CTreeCtrlで表示しているノードを
テキストに格納して、ファイルオープン等で、読み込んで
ツリービューに表示したいのですが
VC++の参考書ではfopen系の機能をまとめた
「CStdioFile」を使うと書いてあるのですが、
リファレンスと参考書を見比べるていて、
引数や使い方が違うので困っています。
また、自分なりに書いたソースでは
「無題のファイルには無効のパスが含まれています。」
というエラーが出ます。
ネット等で検索すると他の方もなってたみたいで
その方は、fopenを使ったらエラーが出なくなったそうです。
「CStdioFile」の使い方をご存知の方、教えて頂けないでしょうか?
よろしくお願いします。
これがソースです。
CString str[75],fname;
CFile File;
int i;
CStdioFile fin(fname,CFile::modeRead);
if ( !File.Open( _T(C:\\vctree\\*.txt), CFile::modeRead, NULL ) )
{
AfxMessageBox(ファイルオープンエラーで
す。,MB_OK|MB_ICONINFORMATION);
}
while(fin.ReadString(str[i]) != NULL){
m_HndTree[0] = m_tree.InsertItem(str[0],TVI_ROOT);
m_HndTree[1] = m_tree.InsertItem(str[1],m_HndTree[0]);
m_HndTree[2] = m_tree.InsertItem(str[2],m_HndTree[1]);
m_HndTree[3] = m_tree.InsertItem(str[3],m_HndTree[1]);
省略
}
> 自分なりに書いたソースでは
は具体的にどのようなコードなのでしょうか?
> リファレンスと参考書を見比べるていて
参考書はバージョンがいくつのものについて記述されていますか?
リファレンスはバージョンがいくつのものについて記述されていますか?
>if ( !File.Open( _T(C:\\vctree\\*.txt), CFile::modeRead, NULL ) )
は何のためでしょうか?
Windowsでは*.txtのようなファイルは存在することはできません。
ファイルが開けたかどうかはCStdioFileのコンストラクタでエラーをthrowするので
それをcatchすることで確認できます。
例)
CString strFileName(_T(a.txt));
TRY
{
CString strLine;
CStdioFile fInStream(strFileName, CFile::modeRead | CFile::typeText);
while (fInStream.ReadString(strLine))
{
AfxMessageBox(strLine);
}
fInStream.Close();
}
CATCH (CFileException, e)
{
// エラー処理
}
END_CATCH
早速の返信ありがとうございます。
すいません。記述するのを忘れていました。
http://msdn.microsoft.com/ja-jp/library/6337eske.aspx
リファレンスはこれを参考にしています。
参考書は,6.0「新Visual C++6.0入門」を参考にしています。
になります。お願いします。
if ( !File.Open( _T(C:\\vctree\\*.txt), CFile::modeRead, NULL ) )
↑の部分は、恥ずかしながら
openエラーのつもりです。
「*.txt」の部分は、最初「部材.txt」にしていたのですが
一緒のエラーがでるので
コマンドプロンプトの命令で、*::ワイルドカードでしたっけ?
「*.txt」この様な感じで使えるかな~と思い書いていました。
> CStdioFile fin(fname,CFile::modeRead);
fnameが空でないですか?
実際に使うファイル名を代入しないとだめです。
> コマンドプロンプトの命令で、*::ワイルドカードでしたっけ?
> 「*.txt」この様な感じで使えるかな~と思い書いていました。
CFileDialogでファイル名を取得します。
詳しくはMSDNで調べてください。
参考書にも載っていると思います。
すいません。色々やっていて、返信遅くなりました。
Blueさんすいません。
Blueさんの例、ほとんど丸々使わさせて頂いてます。
Blueさん,ITOさんのおかげで、エラーは取れました。
が、まだ少し質問が残っています。
①Seekの使い方について
②テキストで読み込んだ文字列をどうやって親子関係にすればいいのか
の順に質問したいと思います。
まず①なんですが現在テキストの中は
1000|01-00-00|《aaaaa》 こういう感じになっています。
そこでSeekを使って「《aaaaa》」これだけを取り出したいのですが
使い方が違うのか、1列丸ごと表示されます。
CString strLine[15];
CStdioFile fInStream(strFileName, CFile::modeRead | CFile::typeText);
fInStream.Seek( 5, CFile::begin );
while (fInStream.ReadString(strLine[i]))
{
//AfxMessageBox(strLine);
m_HndTree[0] = m_tree.InsertItem(strLine[i],TVI_ROOT);
省略
}
よろしく、お願いします。
> fInStream.Seek( 5, CFile::begin );
読み出し位置がちょっとズレるだけですけど...
とにかく一行まるっと読んで、欲しいトコだけ抽出するが吉。
すいません。その処理が解りません。
その摘出する方法を教えて頂けないでしょうか?
'|'を区切り文字としてstrtokとかSplitとか使えばいいんじゃないかと。
επιστημηさんの
おっしゃった、strtok,Split調べてやってみます。
あちこちに、ぶつかりながらなので
返信が遅くなるか、明日になるかもしれません。
CStringですよね。
>1000|01-00-00|
ここまでも文字数は固定ですか?
固定なら
CString slに一行分のデータを読み込んで
CString s = sl.Mid(文字数+1);
とすれば、sに「《aaaaa》」のデータが入るはずです。
詳しくはMSDNで調べてください。
CStringを調べてみてください。
修正です。
>CString s = sl.Mid(文字数+1);
↓
CString s = sl.Mid(文字数);
こうですね。
詳しくはMSDNで調べてください。
> Blueさん
> ファイルが開けたかどうかはCStdioFileのコンストラクタでエラーをthrowするので
それをcatchすることで確認できます。
例外処理をエラー処理として使用しちゃいけないでしょう。(C++では)
なので、例外処理よりは Open の戻り値でエラーを拾うのが正しいです。