如何从c ++中的文件中读取双精度
Posted
技术标签:
【中文标题】如何从c ++中的文件中读取双精度【英文标题】:How to read in a double from a file in c++ 【发布时间】:2011-02-06 14:08:26 【问题描述】:如何从 C++ 文件中读取双精度值?
对于整数,我知道您可以使用 getline() 然后使用 atoi,但我没有找到一个数组来加倍函数。什么可用于读取双精度数或将 char 数组转换为双精度数?
【问题讨论】:
为什么不将其作为 char* 读入并使用 sscanf? @incrediman:因为如果您已经在使用标准流,那么您可能不想处理 C 函数问题。 如果你想坚持做getline()
然后atoi()
,你可以用atof()
替换atoi()
,你应该没问题。但是@R Samuel Klatchko 的方法应该适用于双打和整数。
【参考方案1】:
您可以使用流提取:
std::ifstream ifs(...);
double d;
ifs >> d;
这项工作提供了除了空格之外,流中的下一个数据应该是文本表示形式的双精度。
提取后,可以查看流的状态,看看是否有错误:
ifs >> d;
if (!ifs)
// the double extraction failed
【讨论】:
这是错误的。测试流是否失败(.fail()
,与.good()
略有不同,相当于.rdstate() == 0
)。使用if (!(ifs >> d)) /*failed*/
或ifs >> d; if (!ifs) /*..*/
或(通常更有用)if (ifs >> d) /*use d*/ else /*failed*/
。
(使用!stream
与stream.fail()
相同,使用bool(stream)
与!stream.fail()
相同。)【参考方案2】:
不要考虑使用 atof() 或任何 ato.. 函数,因为它们不允许您诊断错误。看看strtod 和strtol。或者使用流提取操作符。
【讨论】:
@sblom 是您反对的语法吗?如果有,请提出改进建议。 在其他新闻中,@Neil,我刚刚注意到您是“历史上最优秀的 C++ 回答者”,累积了 1337 个回答!赢! ***.com/questions/…【参考方案3】:我想知道,是否需要注意语言环境设置(例如,语言环境可以使用逗号而不是点来分隔小数部分)还是字符串流总是默认为某些标准的“C 语言环境”表示法?
【讨论】:
【参考方案4】:您可以利用istringstream 例如,这里有 toDouble 和 toInt:
double toDouble(string s)
double r = 0;
istringstream ss(s);
ss >> r;
return r;
int toInt(string s)
int r=0;
istringstream ss(s);
ss >> r;
return r;
【讨论】:
这已经存在于 boost 中,以包括错误检查在内的更好的形式存在,如 lexical_cast。 @Roger Pate:是的,确实如此。这对于无法使用 boost 的情况很有用。 @Billy:它并不比 atof 有用,应该避免 Neil 正确地使用 points out(除非您已经验证了输入,但这里不是这样)。 这没有回答问题。 (@Billy:由于您对您现在已删除的答案投了一个神秘的反对票,我不得不说那不是我,我也没有因为仅仅建议 atof 或省略错误而在此反对任何答案处理。我在过去 18 小时内没有投票,我的下一个 30 也已经为格林威治标准时间 0:01 添加了书签。:P)以上是关于如何从c ++中的文件中读取双精度的主要内容,如果未能解决你的问题,请参考以下文章