C言語関係掲示板

過去ログ

No778 テキストファイルから数字だけ取り出す

[戻る] [ホームページ]
No.9645

テキストファイルから数字だけ取り出しを格納したい
投稿者---金子(2003/10/08 19:34:41)


文字列を数字で構成されているファイルから、
数字(マイナスを含む)だけを取り出して格納したいのですが、
どうも上手くいきません。
どうすればよくなるでしょうか??

ファイルの中は、

あああ 2222 5555
avvff 333 -333 9.444+e008
ffafa -4.555 8888 9999


このようになっています。
これをfloat型のitem[]へ格納してから
画面へ出力したいのです
なお、文字と文字の間には、半角スペースがあります。

<pre>
#include <stdio.h>
#include<iostream>
#include<fstream>
using namespace std;
int main(void)
{
&lt
  char outfile[] = "a.txt"; //読み込むファイルの指定

  ifstream fin( outfile, ios::in | ios::binary );
  // ファイルを開く
  // ios::in は読み込み専用 ios::binary はバイナリ形式

  if (!fin)
  {
    cout << "ファイル file.txt が開けません";
    return 1;
  }
  // ファイルが開けなかったときの対策

   double d; //文字列ではないデータ
   double item[1000];
   int k=0,l=0;

   while(!fin.eof()) //ファイルの最後まで続ける
   {
     //文字列ではないデータを読みこむ
     fin.read( ( char * ) &d, sizeof( double ) );
     item[k++]= d;
     //  cout << d << endl;
      l++;
   }

   int y=0;
    for(y=0;y<l;y++){
      cout<<"fileの中にある数字:"<<item[y]<<endl;
    }

    fin.close(); //ファイルを閉じる

 return 0;
</pre>

} 

このソースを見て、どこが悪いのか教えていただけないでしょうか?
どうか宜しくお願いします。

No.9652

Re:テキストファイルから数字だけ取り出しを格納したい
投稿者---ほげ(2003/10/08 21:35:57)


テキストファイルなのにバイナリ?
む〜〜ん・・・

No.9655

Re:テキストファイルから数字だけ取り出しを格納したい
投稿者---金子(2003/10/08 21:52:42)


>テキストファイルなのにバイナリ?
>む〜〜ん・・・

すみません。
テキスト形式だけでOKです。
わたしの書いたソースでは、
数字の変換が上手くいかないのです。
何がいけないのでしょうか??

No.9656

Re:テキストファイルから数字だけ取り出しを格納したい
投稿者---ほげ(2003/10/08 22:00:43)


C++のことはよくわからないんですけど
まず1行を文字列として読み込んで
その文字列をsscanfで読み込むことはできないのでしょうか?

なんだか曖昧ですいません・・・

No.9669

Re:テキストファイルから数字だけ取り出しを格納したい
投稿者---まり(2003/10/09 13:29:30)


>fin.read( ( char * ) &d, sizeof( double ) );
これだと、ファイルの内容に関係なく、8バイトづつ読み込むことになってしまいます。

ほげさんが言われているように、
>まず1行を文字列として読み込んで
>その文字列をsscanfで読み込むことはできないのでしょうか?
の方法で、できると思います。

whileの中を

。厩圓鼎墜匹濆む:getline()
■厩塋のデータを空白で区切って取得する:sscanf()
doubleに変換できたデータをitemに設定する:strtod()

のように変えるとできると思います。
↓は各行のデータ数分繰り返してくださいね。



No.9657

Re:テキストファイルから数字だけ取り出しを格納したい
投稿者---かずま(2003/10/08 22:05:06)


> 数字の変換が上手くいかないのです。
> 何がいけないのでしょうか??
 
while ループを次のものに置き換えてみてください。

   string s;
   do {
       while (fin >> d) item[l++] = d;
       fin.clear();
   } while (fin >> s);

それから、先頭の #include <stdio.h> を #include <string> にしてください。

これでうまくいきますか?


No.9672

Re:ありがとうございました
投稿者---金子(2003/10/09 19:51:05)


かずま様
ありがとうございました。
無事成功しました。

また、何かあったら宜しくお願いします

No.9673

Re:テキストファイルから数字だけ取り出しを格納したい
投稿者---ほげ(2003/10/09 20:14:12)


後学のために教えてください。
このコードの時「ABC 123 DEF」という文字の時は
どういう処理になるんですか?



No.9683

Re:テキストファイルから数字だけ取り出しを格納したい
投稿者---かずま(2003/10/09 22:45:51)


> このコードの時「ABC 123 DEF」という文字の時は
> どういう処理になるんですか?
   double d;
   string s;
   do {
       while (fin >> d) item[l++] = d;
       fin.clear();
   } while (fin >> s);

fin >> d を実行しようとしますが、入力の「A」は double に変換できません
から fin 内部のフラグに入力エラーが設定されます。

そして、fin >> d の結果は fin であり、while (fin) では fin が false に
なってループを抜けます。

fin.clear() で fin 内部のエラーフラグをリセットします。

fin >> s で s には "ABC" が入ります。

} while (fin >> s); の括弧内は true になり、do { に戻ります。

次の fin >> d は成功して、d には 123.0 という値が入ります。
成功したので、while ループに入り、item[0] に 123.0 が代入されます。
l は 1 になります。

次の fin >> d は失敗します。スペースを読み飛ばした後の入力が「D」なので。
このエラーは、fin.clear() でリセットされます。

fin >> s で s に "DEF" が入ります。

} while (fin >> s); の括弧内は true になり、do { に戻ります。

次の fin >> d は、入力がないので失敗します。
fin >> s も失敗し、do-while ループを抜けます。

これで理解されましたでしょうか?


No.9690

Re:テキストファイルから数字だけ取り出しを格納したい
投稿者---ほげ(2003/10/10 10:39:23)


ご丁寧に教えていただきありがとうございました。
充分に理解できました。