一行(一文字)読み出しについて

[戻る]
まお 2004/11/28(日) 18:04:49
初歩的な質問だとは思いますが、よろしくお願いします。

VC++6.0を使用しております。

ちょっと紛らわしい話になるかもしれませんが、お許しください。

まず、ダイアログ上に、1つのスタートボタンが置かれています。
そのスタートボタンを押すたびに、一行一文字で構成されているテキストファイルか
ら、一行一文字だけを読み出し、ダイアログ上に表示されている他のコントロール上に
表示したいと思っています。
ライブラリや本掲示板の書き込みを拝見したところ、fgetsを使えばできそうな感じがし
たのですが、どうも勝手がわかりません。

ちなみに、テキストファイルの具体的な表示形式は、
3
1
5
2
1
4
5
2
3
のようになっています。

本当に甘ったれのような質問になってしまいますが、何卒よろしくお願いいたします。

dairygoods 2004/11/28(日) 18:31:48
> 本当に甘ったれのような質問になってしまいますが、何卒よろしくお願いいたします。

「勝手が分かりません」だけでは、質問にすらなっていません。
何を参考にして、何がわかり、何が分からないのですか?

KING・王 2004/11/28(日) 19:46:52
ボタンが押されたら、以下の動作をすればよいのでは?

(1)fegets()で1行読み込む。
(2)SetDlgItemInt() or SetDlgItemText()などで、読み込んだデータを、
   コントロール上に表示する。

ただし、ファイル終端までに読込み表示したあとで、ボタンを押された場合は、
どのような動作にするのでしょうか?
少なくともこの場合の仕様を定義しないと、色々と問題になったりすると思いますが。。。
(ファイルオープン及びクローズのタイミングをどうすらかなど。。)

取りあえず、こんなもんで。

#fgets(), SetDlgItemIntI(), SetDlgItemText()などに関しては、
#その関数の仕様はご自分で調べて下さい。

monkey 2004/11/28(日) 21:38:01
> スタートボタンを押すたびに、一行一文字で構成されているテキストファイルから、
> 一行一文字だけを読み出し、
> ダイアログ上に表示されている他のコントロール上に表示したい

示された例からみればファイルのサイズはそれほど大きくないと思われます。
であれば、ボタンを押すたびにファイルにアクセスするのでなく、

1.ダイアログボックスが起動したときに、
 1-1.ファイルの内容を全て文字列(=行)の配列に読み込むとともに、
 1-2.次に表示すべき要素のインデックスを0で初期化

しておき、

2.ボタンが押されたときに、
 2-1.配列中の現在のインデックスに対応する要素を表示し、
 2-2.インデックスをインクリメントする

という処理にしてはいかがでしょうか。

例えば:

  // ダイアログボックスクラスのデータメンバ

    std::vector< std::string > lines_; // 文字列の配列
    int pos_; // 表示すべき要素のインデックス


  // 1.ダイアログボックス起動時の処理〜OnInitDialog関数内

    // 1-1.ファイル読み込み
    std::ifstream from( ファイル名 );
    if( from.fail() ){
        // エラー処理
    }
    for( std::string s; std::getline( from, s ); lines_.push_back( s ) ){
        ;
    }

    // 1-2.インデックス初期化
    pos_ = 0;


  // 2.ボタンがクリックされたときのイベントハンドラ内

    // 2-1.lines_[ pos_ ] をコントロールに表示する
    // スタティックコントロールやエディットコントロールだったら
    // SetWindowText関数あたりで良さそう.

    // 2-2.インデックスをインクリメントする(最後に達したら0に戻る)
    pos_++;
    pos_ %= lines_.size();

PATIO 2004/11/29(月) 13:27:52
C++らしく解決したいならmonkeyさんが提案されているようにストリーム系のクラスを
使ってプログラミングした方がよりよいかなと言う気がします。
C++の本では大抵はストリームで説明されているはずですし。


実装の方は、もし課題と言うことであれば、課題の意図した内容にもよるので
これは、まおさん次第でしょう。これを読んでいる方にはそこまで把握できませんし。

話の感じからするとC++言語の入門書をお持ちではないように感じます。
全くプログラミング言語の経験がないとか、VB以外の言語経験が無いと言うのであれば、
少なくともC++言語の入門書を一冊は手元においておかれた方が良いと思います。
もしくは、C++言語入門関連のホームページを漁って簡単なサンプルを見ながら
ワンステップごとにそれが何を意味しているのかを調べながら勉強するとか。

一つ一つに意味合いを確実に理解しながら進まないとある程度進んでから自分の勘違いに
振り回されたりするので何かよりどころになるしっかりとした情報源を手元に確保して
おく方が懸命です。
掲示板に関しては故意に嘘を教えたりする人はいないと思いますが、
書き込まれた情報が正しいかどうかは最終的には情報を受取った人の判断に委ねられます。
掲示板に頼り切ってしまうと問題が複雑化したときに解決する事が出来なくなってしまう
事にもなりかねないので、参考情報の一つぐらいにされた方がいいでしょう。

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