ファイルから読み込んだ内容をリストボックスに表示するには? – プログラミング – Home

ファイルから読み込んだ内容をリストボッ...
 
通知
すべてクリア

[解決済] ファイルから読み込んだ内容をリストボックスに表示するには?

固定ページ 1 / 2

じろう
 じろう
(@じろう)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

じろうです。はじめましてよろしくお願いします。MFCを利用しています。

CFile file;
if (!file.Open( name,CFile::modeCreate | CFile::modeWrite))
{
CString scm = a;
MessageBox(scm);
}
とファイルをオープンした後、Readを用いてファイルの内容を取得しようとしています。

リストはCComboBoxで定義しているので、AddString等を用いた場合、どのようにReadで得た内容をリストに表示していいのか分かりません。Readの戻り値はバイト数ですよね?これをどのようにしてリストに文字列を追加すればいいのでしょうか?
CComboBox や CFile を用いなければよいのでしょうか?
すみませんがどなたかアドバイス頂けないでしょうか。お願いします。


引用未解決
トピックタグ
sugar
 sugar
(@sugar)
ゲスト
結合: 23年前
投稿: 448
 

ファイルの中は、どのようにデータが格納されているのでしょうか?
それによって、適したやり方は変わってきます。

1行1データ(文字数不定、改行)のテキストファイルであれば、
CFileよりも、fgets()で1行読み込みの方がいいかもしれないし...


返信引用
じろう
 じろう
(@じろう)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

お返事ありがとうございます。

ファイルはテキストファイルです。
ファイルの内容も

ああああ
おおおお
かかかか

といった単純なないようです。

fgets()は、どのクラスで定義されているのですか?
そのときOPENは使わず、fopenを使った方がいいのでしょうか?


返信引用
Hal
 Hal
(@Hal)
ゲスト
結合: 24年前
投稿: 67
 

Halです。
CFileクラスを使わずに、CStdioFileクラスを使用して
ReadString()で一行づつ読み込んで、コンボボックスに
追加すればよいのでは。
それでは。


返信引用
じろう
 じろう
(@じろう)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

お返事ありがとうございます。

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しても同じエラーが出ます。
すみません、ファイルへのアクセスについて、また上記のプログラムについてなにかアドバイスをお願いします。


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 23年前
投稿: 448
 

ReadString()するのに、Open時のフラグ設定は

CFile::modeCreate | CFile::modeWrite

でいいんでしたっけ?
CFile::modeReadは?
ま、これが原因かどうかはわからないんですが。


返信引用
loca
 loca
(@loca)
ゲスト
結合: 23年前
投稿: 6
 

ファイルのオープンモードが違います。
CFile::modeCreateを設定されていますが、これでは新規に長さ0のファイルを
作成してしまっているはずです。
ファイルの内容を読み取るには
CFile::modeReadまたはCFile::modeReadWriteを指定する必要があります。
また、CStdioFileを使っているのでCFile::typeTextも指定する必要があったと思います。
詳しくはCFile::CFileのヘルプを参照してください。

それからリストボックスにファイルの内容を追加する部分は
以下のようにループ処理したほうがいいと思います。

while(file.ReadString(buf,99)){
// リストボックスにbufの内容を追加
}


返信引用
じろう
 じろう
(@じろう)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

じろうです。sugerさん,locaさん度々返答ありがとうございました。

Open時のフラグ設定の件ですがご指摘があったように、CFile::CFileを調べて修正しました。

リストボックス追加の処理も修正しました。ありがとうございます。

ただ、相変わらず ファイルアクセス中に不明なエラーが出ました と表示されます。
ファイルオープン時に、ファイルがオープンできなければエラーメッセージを表示するという処理を加えているのに・・・そのエラーは出ませんからどうしていいやら・・・

いろいろファイルへのアクセスに関しても過去ログなどをみているのですが。
どなたかアドバイス頂けないでしょうか。


返信引用
Milk
 Milk
(@Milk)
ゲスト
結合: 23年前
投稿: 4
 

if(fp.Open(souji.txt,CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite) == 0){
MessageBox(IDS_OPENERR);
}


返信引用
Milk
 Milk
(@Milk)
ゲスト
結合: 23年前
投稿: 4
 

ごめんなさい↑のカキコ、失敗してしまいました。

参考になるかはわかりませんが、私は
CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite
を指定してファイルを開いてます。


返信引用
じろう
 じろう
(@じろう)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

ちなみに、ダイアログを呼び出すまえの処理を以下に示します。

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;
}


返信引用
じろう
 じろう
(@じろう)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

MILKさん、ありがとうございます。
ファイルへの不明なアクセスが出ました の表示はおかげさまで消えました。ありがとうございます。
ただ、リストにファイルの内容が表示されないという状態が続いています。

file.ReadString(buf,99);
z_list1.AddString(buf);

では、リストに文字列追加できていいないんでしょうか。


返信引用
じろう
 じろう
(@じろう)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

じろうです。度々すみません。

デバッガを利用して、bufの中を見ると、テキストファイルの内容が一行一行読み込まれていて、配列の一つ一つに
一文字一文字格納されてはいます。

char buf[100];で定義しているからいけないのですか?

これの代わりに、CString buf;
として利用するとエラーが出ます。


返信引用
じろう
 じろう
(@じろう)
ゲスト
結合: 23年前
投稿: 17
Topic starter  

度々すみません。その後プログラムを追加しました。

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);
 としているので、リストに表示されない理由が見当たらないのですが。
どなたかアドバイスお願いします。本当に困りました。


返信引用
loca
 loca
(@loca)
ゲスト
結合: 23年前
投稿: 6
 

AddStringの戻り値は正常ですか?
また、CListBox::GetTextなどを使って、リストボックスに
追加されているはずの文字列を取り出して確認してみては?


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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