【问题标题】:How to read in a double from a file in c++如何从c ++中的文件中读取双精度
【发布时间】:2011-02-06 14:08:26
【问题描述】:

如何从 C++ 文件中读取双精度值?

对于整数,我知道您可以使用 getline() 然后使用 atoi,但我没有找到一个数组来加倍函数。什么可用于读取双精度数或将 char 数组转换为双精度数?

【问题讨论】:

  • 为什么不将其作为 char* 读入并使用 sscanf?
  • @incrediman:因为如果您已经在使用标准流,那么您可能不想处理 C 函数问题。
  • 如果你想坚持做getline()然后atoi(),你可以用atof()替换atoi(),你应该没问题。但是@R Samuel Klatchko 的方法应该适用于双打和整数。

标签: c++ file-io input double inputstream


【解决方案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.. 函数,因为它们不允许您诊断错误。看看strtodstrtol。或者使用流提取操作符。

【讨论】:

  • @sblom 是您反对的语法吗?如果有,请提出改进​​建议。
  • 在其他新闻中,@Neil,我刚刚注意到您是“历史上最优秀的 C++ 回答者”,累积了 1337 个回答!赢! stackoverflow.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)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多