我正在尝试将文本文件的内容读入类的属性中。该文件的结构使得每行包含该类的一个对象所需的所有信息。一行可能如下:
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
是我存储的Vector,source
是已经指向文件的文件流。
在TycDat
的构造函数中,我创建了与std::istringstream
参数std::string
关联的line
,并使用>>
运算符按顺序读取值属性。这在很大程度上起作用。我必须创建一些char
数组才能读取其中的一些数组,其中hd 210531
对应于string
运算符将拆分的一个>>
。< / p>
我的真正问题来自最后一部分,在示例8.80 P F5 5 6440
中。它说F5实际上是两个值,一个字母和一个数字,我需要分别存储为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
一个字符,然后使用TClass = iss.get()
来获取TClass
,但我不知道如何检查下一个值是否存在在阅读之前。
嗯,我可以peek
查找与' '
不同的值,然后使用>>
运算符....
好吧,我会尝试一下,我猜你会知道它是怎么回事。谢谢您的帮助。任何其他意见表示赞赏。在写完这一切之后,我对删除这个问题感到很难过。
答案 0 :(得分:0)
我的建议是看看Boost.Spirit。它允许您自然地表达输入字符串的格式,并且如果(当!)输入格式发生变化,将使未来的更改更容易。作为奖励,它在运行时运行得更快! http://www.boost.org/doc/libs/1_44_0/libs/spirit/doc/html/spirit/introduction.html 祝你好运