リストに格納したデータをファイルに出力させる方法

[戻る]
May 2005/03/24(木) 16:53:26
Windows XP
VC 6.0++

現在リストを使ったプログラミングをしているのですが、
あるリストにデータを格納し、そのデータをtxtファイルに
書込みしたいのですが、どうしたらよいのかわかりません。

     list<CFileData>    m_RecDataList; //ヘッダ部の記述

    CFileData recdata;

         // 現在のデータを取得し、リストに追加する
           recdata.m_Latitude = m_oLatitude;
     recdata.m_Longitude = m_oLongitude;
         
         // 記録データリストに追加する
         m_RecDataList.push_back(recdata);

何かアドバイス頂けると有難いです。
宜しくお願い致します。

おぉう 2005/03/24(木) 17:58:56
リストから1個ずつCFileDataのデータを取り出して
txtファイルに出力するだけですけど。
どのような形式で出力するかは知りませんけど。

PAI 2005/03/24(木) 18:25:03
> どうしたらよいのかわかりません。

何がわからないのかがよくわかりません。

リストへの格納の仕方がわからないのか
 (この部分はソースがあるので出来ていると考えられますが。)
リストからの取り出し方がわからないのか、
テキストファイルの扱い方がわからないのか、
テキストファイルへの、ここでいうCFileDataの書き出し方がわからないのか?


まず、問題を分割しましょう。

May 2005/03/27(日) 02:47:01
お返事が遅くなってしまい申し訳ございません。。

リストに格納したデータをテキストファイルに書き込む仕方が
わからなかったのですが、無事にテキストファイルに書き込みが
できました。お騒がせしました。

ただ、再度質問をさせてください。。

今度は書き込んだテキストファイルを読み込んで、
もう1つのリストに読み込んだデータを格納したいのです。

テキストファイルはCFileクラスを使用し、読み込みは完了しています。
読み込んだファイルの内容は
[test,4,0,10,10,10,10,10,10,10,10,0,0,0,0,0,0] ← このようなデータです。

上記内容で1個のリストデータになるのですが、

新たにリストを作成し、カンマごとに区切ってある1つずつのデータを
そのリストの中の変数に格納させたいのですが、
どのような方法で格納すればよいのかいまいちイメージがつきません。。
なにかアドバイス頂けると助かります。


説明が不足しているかもしれませんが、
宜しくお願いいたします。

Blue 2005/03/27(日) 03:31:32
strtok,sscanfなどを利用して各値を取得すればいいようですが。
(今回はデータ数が多そうなので、CFileDataに読み込んだファイルの内容の文字列を
渡して、内部でメンバ変数に設定するメソッドを追加するのがいいでしょう)



# 個人的に MFC を使っているならば list(vecotr)よりも CList(CArray)のほうがスキで
すね。

May 2005/03/28(月) 12:52:46
Blueさん、有難うございます。
ただ、strtokを使用し各項目の文字列を取得したいのですが、
token変数の値がNULLになってしまいます。

while( !cFStrm.eof() )    // ファイルの最後まで検索します。
{
 cFStrm
  >> chData1    // 文字列を取り出す
}
 char seps[]   = " ,\t\n";
        char *token;

        token = strtok( chData1, seps );

        while( token != NULL )
        {
          printf( " %s\n", token );
          token = strtok( NULL, seps );
        }

上記の様なプログラムを書いております。
chData1にテキストファイルから読み込んだデータが格納されるような
処理にしています。

tokenに正常な値が格納されるにはどうしたらよいのでしょうか。。
申し訳ありませんが、アドバイス頂けると有難いです。

宜しくお願い致します。

REE 2005/03/28(月) 13:38:18
最後に読んだ文字列(最終行の何もない部分かも)に対してのみトークン分離していま
す。
トークン分離を while( !cFStrm.eof() ) のループ内に入れてください。

May 2005/03/28(月) 17:34:24
REEさん、アドバイス有難うございます。
while( !cFStrm.eof() )の中に入れたところ、無事に読み込めました。
度々すみません。
この後、読み込んだトークンを1項目ずつ変数に入れたいのですが、
下記の様な記述だと、aには入りますが、トークンが終わるまで
aに入りつづけてしまう状況になってしまいます。

トークンが15項目程あるので、15個の変数に入れたいのですが、
どのように格納していけばよろしいでしょうか?
アドバイス頂けると有難いです。
何度も申し訳ありませんが、宜しくお願いいたします。


////////////////////////////////////////////////////

cFStrm
>> chData1;    // 文字列を取り出す
token = strtok( chData1, seps );

while( token != NULL )
{    
  a = token;
}

Blue 2005/03/28(月) 17:44:12
カウンタかなんかをつくって、switchでいれるとか。

int n = 0;
token = strtok( chData1, seps );

char s[ 32 ] = { 0 };
int  i, j, k;

while ( token != NULL )
{
    switch ( n++ )
    {
        case 0:
            strcpy( s, token );
            break;
        case 1:
            i = atoi( token );
            break;
        case 2:
            j = atoi( token );
            break;
        case 3:
            k = atoi( token );
            break;
    }
    token = strtok( NULL, seps );
}

REE 2005/03/28(月) 17:53:21
>トークンが15項目程あるので、15個の変数に入れたいのですが、
>どのように格納していけばよろしいでしょうか?

まず、15個の変数を準備してください。
その後、それに格納します。

>何度も申し訳ありませんが、宜しくお願いいたします。

回数が多いのは問題ありませんが、あなたの努力の跡が感じられない点が問題なのです。
ここは、質問者の疑問点を解消するための掲示板であって、プログラムを手伝うための掲
示板ではないのです。
最初の質問もそうでしたが、あなたが、どの部分を疑問に思っているのかが分からないの
です。

もし、試してみて駄目だったのであれば、その失敗したソースを提示したうえで、
どのように期待と違うのかを示してください。

また、質問した内容が解決できた場合には、
どのように解決したのかを具体的に報告されることを希望します。

May 2005/03/29(火) 16:07:34
皆様、様々なアドバイス、そしてご注意有難うございます。
表題の件、及び読み込みの件、無事解決いたしました。

token = strtok( chData1, seps );
Sample_data = atoi( token );

token = strtok( NULL , seps );

というような記述をすれば、1項目ずつtokenにchData1の
先頭アドレスが格納されるので、
変数分上記の処理を実行すれば1行分のデータから、
区切りごとにデータを変数に取得可能になりました。

いろいろとお騒がせを掛けましてすみませんでした。
そして、アドバイス頂き有難うございました。

May 2005/03/29(火) 18:26:47
[[解決]]
解決ボタン忘れてました(^^;

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