CStdioFileについて – プログラミング – Home

通知
すべてクリア

[解決済] CStdioFileについて

固定ページ 1 / 5

いけやん
 いけやん
(@いけやん)
ゲスト
結合: 16年前
投稿: 32
Topic starter  

ども、最近毎日質問している

いけやんです。

CStdioFileの事でエラーが出て困っています。

開発環境
WinXP Pro
Visual C++6.0
MFC ダイアログベース

CTreeCtrlで表示しているノードを

テキストに格納して、ファイルオープン等で、読み込んで

ツリービューに表示したいのですが

VC++の参考書ではfopen系の機能をまとめた

「CStdioFile」を使うと書いてあるのですが、

リファレンスと参考書を見比べるていて、

引数や使い方が違うので困っています。

また、自分なりに書いたソースでは

「無題のファイルには無効のパスが含まれています。」

というエラーが出ます。

ネット等で検索すると他の方もなってたみたいで

その方は、fopenを使ったらエラーが出なくなったそうです。

「CStdioFile」の使い方をご存知の方、教えて頂けないでしょうか?

よろしくお願いします。


引用未解決
トピックタグ
いけやん
 いけやん
(@いけやん)
ゲスト
結合: 16年前
投稿: 32
Topic starter  

これがソースです。

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]);
    省略
}


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> 自分なりに書いたソースでは
は具体的にどのようなコードなのでしょうか?

> リファレンスと参考書を見比べるていて
参考書はバージョンがいくつのものについて記述されていますか?
リファレンスはバージョンがいくつのものについて記述されていますか?


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>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


返信引用
いけやん
 いけやん
(@いけやん)
ゲスト
結合: 16年前
投稿: 32
Topic starter  

早速の返信ありがとうございます。

すいません。記述するのを忘れていました。

http://msdn.microsoft.com/ja-jp/library/6337eske.aspx
リファレンスはこれを参考にしています。

参考書は,6.0「新Visual C++6.0入門」を参考にしています。

になります。お願いします。


返信引用
いけやん
 いけやん
(@いけやん)
ゲスト
結合: 16年前
投稿: 32
Topic starter  

if ( !File.Open( _T(C:\\vctree\\*.txt), CFile::modeRead, NULL ) )

↑の部分は、恥ずかしながら

openエラーのつもりです。

「*.txt」の部分は、最初「部材.txt」にしていたのですが

一緒のエラーがでるので

コマンドプロンプトの命令で、*::ワイルドカードでしたっけ?

「*.txt」この様な感じで使えるかな~と思い書いていました。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> CStdioFile fin(fname,CFile::modeRead);
fnameが空でないですか?
実際に使うファイル名を代入しないとだめです。

> コマンドプロンプトの命令で、*::ワイルドカードでしたっけ?
> 「*.txt」この様な感じで使えるかな~と思い書いていました。
CFileDialogでファイル名を取得します。
詳しくはMSDNで調べてください。
参考書にも載っていると思います。


返信引用
いけやん
 いけやん
(@いけやん)
ゲスト
結合: 16年前
投稿: 32
Topic starter  

すいません。色々やっていて、返信遅くなりました。

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);
    省略
  }

よろしく、お願いします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> fInStream.Seek( 5, CFile::begin );
読み出し位置がちょっとズレるだけですけど...

とにかく一行まるっと読んで、欲しいトコだけ抽出するが吉。


返信引用
いけやん
 いけやん
(@いけやん)
ゲスト
結合: 16年前
投稿: 32
Topic starter  

すいません。その処理が解りません。

その摘出する方法を教えて頂けないでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

'|'を区切り文字としてstrtokとかSplitとか使えばいいんじゃないかと。


返信引用
いけやん
 いけやん
(@いけやん)
ゲスト
結合: 16年前
投稿: 32
Topic starter  

επιστημηさんの

おっしゃった、strtok,Split調べてやってみます。

あちこちに、ぶつかりながらなので

返信が遅くなるか、明日になるかもしれません。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

CStringですよね。

>1000|01-00-00|
ここまでも文字数は固定ですか?
固定なら
  CString slに一行分のデータを読み込んで
CString s = sl.Mid(文字数+1);
とすれば、sに「《aaaaa》」のデータが入るはずです。
詳しくはMSDNで調べてください。
CStringを調べてみてください。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

修正です。
>CString s = sl.Mid(文字数+1);
     ↓
CString s = sl.Mid(文字数);
こうですね。
詳しくはMSDNで調べてください。


返信引用
アキラ
 アキラ
(@アキラ)
ゲスト
結合: 23年前
投稿: 49
 

> Blueさん

> ファイルが開けたかどうかはCStdioFileのコンストラクタでエラーをthrowするので
それをcatchすることで確認できます。

例外処理をエラー処理として使用しちゃいけないでしょう。(C++では)
なので、例外処理よりは Open の戻り値でエラーを拾うのが正しいです。


返信引用
固定ページ 1 / 5

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました