将字符串转换为双精度,然后将其推送到 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 &gt;&gt; d) .. 根据您的库支持,还有std::stod。您也可以简单地使用 &gt;&gt; 从流中直接读取双精度。 【参考方案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&lt;double&gt; dataistream_iterator&lt;double&gt;(infile), istream_iterator&lt;double&gt;(); @JerryCoffin 感谢您的精彩评论! 就是这样,我忘记了我需要使用临时值,所以现在为什么这是问题更有意义了。我非常感谢您和其他所有人的帮助。

以上是关于将字符串转换为双精度,然后将其推送到 While 循环中的向量的主要内容,如果未能解决你的问题,请参考以下文章

C++ 将字符串转换为双精度

将字符串转换为双精度 [重复]

如何使用 Javascript 将货币字符串转换为双精度?

反应表单,提交对象,然后将其推送到数组

如何执行两个 Axios GET 请求,映射结果然后将其推送到数组?

将字符串转换为双精度的最佳方法