0

テキスト ファイルの内容をクラスの属性に読み込もうとしています。このファイルは、クラスの 1 つのオブジェクトに必要なすべての情報が各行に含まれるように構成されています。1 行は次のようになります。

TYC 9537 00066 1 341.76920751 -88.32499920  8.762  9.294 mc1 hd 210531        0.385   8.80 P F5 5  6440  F5 V

私がやっていることは、getline()次のような関数で、ファイルからストリームへの行を読み取ることです:

void LoadFile( std::vector<TycDat*> & target , std::fstream & source )
{
    std::string line ;
    while( std::getline( source , line ) )
    {
        target.push_back( new TycDat ( line ) ) ;
    }
}

はクラスTycDatの名前、 はクラスをtarget格納するベクター、 はsource既にファイルを指しているファイル ストリームです。

のコンストラクター内で、パラメーターに関連付けられたTycDatを作成し、演算子を使用して値を順番に属性に読み込みました。これはほとんどの場合うまくいきました。それらのいくつかを読み取ることができるように、いくつかの配列を作成する必要がありました。たとえば、オペレーターが分割したものに対応します。std::istringstreamstd::stringline>>charhd 210531string>>

私の本当の問題は、最後の部分の 1 つ、例では8.80 P F5 5 6440. F5 は実際には文字と数字の 2 つの値であり、char と int として別々に格納する必要があります。さらに、最後の int が常に存在するとは限りません。

私が今していることは、Pを正しく読んだ後です:

std::string aux_ ;
iss >> aux_ ;
TClass = aux_[0] ;    //     Temperature class (7)
if ( aux_.size() > 1 ) SClass = std::atoi( aux_.data()+1 ) ;  // SubClass

私はそれが好きではありません。主な理由は、新しいstring. しかし、それを正しく機能させる方法がわかりませんでした。問題は、単語を分割することです ( ignore1 つの文字を使用TClass = iss.get()して getを使用できるとTClass思いますが、読み取る前に次の値が存在することを確認する方法がわかりません。

うーん、 とはpeek異なる値を探して' '、演算子を使用でき>>ます....

まあ、私はそれを試してみて、それがどうなるかをあなたに知らせます. 助けてくれてありがとう。その他のコメントをお待ちしております。ここまで書いて質問を消すのは申し訳ないです。

4

1 に答える 1

0

私の提案は、Boost.Spirit を見てみることです。これにより、入力文字列の形式を自然に表現できるようになり、入力形式が変更された場合 (いつ!) 将来の変更が容易になります。おまけとして、実行時にはるかに高速に実行されます! http://www.boost.org/doc/libs/1_44_0/libs/spirit/doc/html/spirit/introduction.html 幸運を祈る

于 2010-09-02T14:36:41.683 に答える