如何从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*/ (使用!streamstream.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 ++中的文件中读取双精度的主要内容,如果未能解决你的问题,请参考以下文章

C语言中如何将文件中的数据读取到链表中

.NET如何从配置文件中读取数据

如何在MATLAB中读入多个音频文件啊?

C语言中,如何实现从文件中读取数据(大量的数据)后,在循环体中使用,每次传递3个值到数组。

如何用C语言统计一个数据文件中的数据个数

在C++中如何读取文本中的数据存储为数组变量?