将字符串转换为双精度,然后将其推送到 While 循环中的向量
Posted
技术标签:
【中文标题】将字符串转换为双精度,然后将其推送到 While 循环中的向量【英文标题】:Converting a string to a double, then pushing it to a vector in a While Loop 【发布时间】:2014-10-14 00:57:25 【问题描述】:vector<double> data;
string content;
ifstream infile;
infile.open("test.txt");
while(getline(infile, content, ' '))
atof(content.c_str());
data.push_back(content);
infile.close();
所以在这里我从文本文件中获取字符串并尝试将它们作为双精度存储到向量中。但是,我收到错误消息,它无法将“内容”推送到数据向量中,因为它不是双精度数。我已经尝试了几件事,并得到了相同的一般错误,即内容没有被转换为双精度。所以我不确定我是否没有注意到一个简单的错误,因为隧道视觉或者是否还有其他我遗漏的东西。感谢您的帮助。
【问题讨论】:
您的代码没有存储atof
的返回值。你也可以做double d; while (infile >> d) ..
根据您的库支持,还有std::stod
。您也可以简单地使用 >>
从流中直接读取双精度。
【参考方案1】:
atof
返回double
,所以这一行
atof(content.c_str());
简单地丢弃结果。你可以这样做:
double tmp = atof(content.c_str());
data.push_back(tmp);
或者没有临时的
data.push_back(atof(content.c_str()));
在 C++ 中将文件读入向量的惯用方式如下:
back_insert_iterator< vector<double> > back_it(data);
copy(istream_iterator<double>(infile)
, istream_iterator<double>()
, back_it);
这使用std::copy
函数以及输入迭代器和推回迭代器来隐藏循环。当您可以结合矢量声明和从文件中读取时,您可以进一步缩短它:
vector<double> data(istream_iterator<double>(cin), (istream_iterator<double>())); // C++98 syntax
或
vector<double> data istream_iterator<double>(cin), istream_iterator<double>() ; // C++11 syntax
C++98 语法使用一对额外的括号来颠覆most vexing parse。
【讨论】:
...或者只是ifstream infile("test.txt"); vector<double> dataistream_iterator<double>(infile), istream_iterator<double>();
@JerryCoffin 感谢您的精彩评论!
就是这样,我忘记了我需要使用临时值,所以现在为什么这是问题更有意义了。我非常感谢您和其他所有人的帮助。以上是关于将字符串转换为双精度,然后将其推送到 While 循环中的向量的主要内容,如果未能解决你的问题,请参考以下文章