じろうです。はじめましてよろしくお願いします。MFCを利用しています。
CFile file;
if (!file.Open( name,CFile::modeCreate | CFile::modeWrite))
{
CString scm = a;
MessageBox(scm);
}
とファイルをオープンした後、Readを用いてファイルの内容を取得しようとしています。
リストはCComboBoxで定義しているので、AddString等を用いた場合、どのようにReadで得た内容をリストに表示していいのか分かりません。Readの戻り値はバイト数ですよね?これをどのようにしてリストに文字列を追加すればいいのでしょうか?
CComboBox や CFile を用いなければよいのでしょうか?
すみませんがどなたかアドバイス頂けないでしょうか。お願いします。
ファイルの中は、どのようにデータが格納されているのでしょうか?
それによって、適したやり方は変わってきます。
1行1データ(文字数不定、改行)のテキストファイルであれば、
CFileよりも、fgets()で1行読み込みの方がいいかもしれないし...
お返事ありがとうございます。
ファイルはテキストファイルです。
ファイルの内容も
ああああ
おおおお
かかかか
といった単純なないようです。
fgets()は、どのクラスで定義されているのですか?
そのときOPENは使わず、fopenを使った方がいいのでしょうか?
Halです。
CFileクラスを使わずに、CStdioFileクラスを使用して
ReadString()で一行づつ読み込んで、コンボボックスに
追加すればよいのでは。
それでは。
お返事ありがとうございます。
Halさんのおっしゃるように、下記のようなプログラムをダイアログのOnInitDialog()に記述しました。
CStdioFile file;
if (!file.Open( pass,CFile::modeCreate | CFile::modeWrite))
{
CString scm = a;
MessageBox(scm);
}
char buf[100];
file.ReadString(buf,99);
z_list1.AddString(buf);
ちなみに、DDX_Control(pDX,IDC_LIST,z_list1);となっています。
IDC_LISTが文字列を追加したいリストIDです。
このプログラムでビルドは成功します。ファイルオープン時のエラー(a)も出ません。
しかし、ファイルへのアクセス中に不明のエラーが出ましたと表示されます。その後ダイアログが表示されます。
もちろんリストの中は空です。
ファイルOpenのpassは、CFileDialog::GetPathName で得たパスです。
CFileDialog::GetFileName で得た名前でOpenしても同じエラーが出ます。
すみません、ファイルへのアクセスについて、また上記のプログラムについてなにかアドバイスをお願いします。
ReadString()するのに、Open時のフラグ設定は
CFile::modeCreate | CFile::modeWrite
でいいんでしたっけ?
CFile::modeReadは?
ま、これが原因かどうかはわからないんですが。
ファイルのオープンモードが違います。
CFile::modeCreateを設定されていますが、これでは新規に長さ0のファイルを
作成してしまっているはずです。
ファイルの内容を読み取るには
CFile::modeReadまたはCFile::modeReadWriteを指定する必要があります。
また、CStdioFileを使っているのでCFile::typeTextも指定する必要があったと思います。
詳しくはCFile::CFileのヘルプを参照してください。
それからリストボックスにファイルの内容を追加する部分は
以下のようにループ処理したほうがいいと思います。
while(file.ReadString(buf,99)){
// リストボックスにbufの内容を追加
}
じろうです。sugerさん,locaさん度々返答ありがとうございました。
Open時のフラグ設定の件ですがご指摘があったように、CFile::CFileを調べて修正しました。
リストボックス追加の処理も修正しました。ありがとうございます。
ただ、相変わらず ファイルアクセス中に不明なエラーが出ました と表示されます。
ファイルオープン時に、ファイルがオープンできなければエラーメッセージを表示するという処理を加えているのに・・・そのエラーは出ませんからどうしていいやら・・・
いろいろファイルへのアクセスに関しても過去ログなどをみているのですが。
どなたかアドバイス頂けないでしょうか。
if(fp.Open(souji.txt,CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite) == 0){
MessageBox(IDS_OPENERR);
}
ごめんなさい↑のカキコ、失敗してしまいました。
参考になるかはわかりませんが、私は
CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite
を指定してファイルを開いてます。
ちなみに、ダイアログを呼び出すまえの処理を以下に示します。
CFileDialog dlg(TRUE);
if (dlg.DoModal() == IDOK)
{
CString y_str = dlg.GetFileExt();
if (y_str == txt)
{
CString name = dlg.GetFileName();
CString pass = dlg.GetPathName();
CEn42Dlg y_dlg;
y_dlg.name = name;
y_dlg.pass = pass;
if (y_dlg.DoModal() == IDOK)
{
return;
}
return;
}
else
{
return;
}
return;
}
MILKさん、ありがとうございます。
ファイルへの不明なアクセスが出ました の表示はおかげさまで消えました。ありがとうございます。
ただ、リストにファイルの内容が表示されないという状態が続いています。
file.ReadString(buf,99);
z_list1.AddString(buf);
では、リストに文字列追加できていいないんでしょうか。
じろうです。度々すみません。
デバッガを利用して、bufの中を見ると、テキストファイルの内容が一行一行読み込まれていて、配列の一つ一つに
一文字一文字格納されてはいます。
char buf[100];で定義しているからいけないのですか?
これの代わりに、CString buf;
として利用するとエラーが出ます。
度々すみません。その後プログラムを追加しました。
while(file.ReadString(buf,99)){
// z_list1.AddString(buf);
list1.AddTail(buf);
}
y_pos = list1.GetHeadPosition();
while(y_pos){
y_str1 = list1.GetNext(y_pos);
z_list1.AddString(y_str1);
}
としました。この時も、デバッカをもちいてy_str1の中には、テキストファイルの一行の内容が入っています。
DDX_Control(pDX,IDC_LIST,z_list1);
としているので、リストに表示されない理由が見当たらないのですが。
どなたかアドバイスお願いします。本当に困りました。
AddStringの戻り値は正常ですか?
また、CListBox::GetTextなどを使って、リストボックスに
追加されているはずの文字列を取り出して確認してみては?