テキスト ファイルの内容をクラスの属性に読み込もうとしています。このファイルは、クラスの 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::istringstream
std::string
line
>>
char
hd 210531
string
>>
私の本当の問題は、最後の部分の 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
. しかし、それを正しく機能させる方法がわかりませんでした。問題は、単語を分割することです ( ignore
1 つの文字を使用TClass = iss.get()
して getを使用できるとTClass
思いますが、読み取る前に次の値が存在することを確認する方法がわかりません。
うーん、 とはpeek
異なる値を探して' '
、演算子を使用でき>>
ます....
まあ、私はそれを試してみて、それがどうなるかをあなたに知らせます. 助けてくれてありがとう。その他のコメントをお待ちしております。ここまで書いて質問を消すのは申し訳ないです。