从文件中读取并在C ++中转换为double

时间:2011-03-31 14:31:42

标签: c++ string double

我在从文件中读取并将内容转换为double时遇到问题。我已经从stackoverflow读取了解决方案但没有任何效果。

我有这个输入文件:

1291.23
291.493
558.089
309.266
513.656
491.44
429.234
851.345
589.192
535.873
802.469
713.604
1002.42
997.973
513.656
313.709
407.018
624.738
460.337
526.986
473.667
1202.36

和程序:

#include <math.h> 
#include <string> 
#include <iostream> 
#include <fstream> 
#include <stdio.h> 
#include <sstream> 

using namespace std; 
void main() { 
    char* filename = "mr1.txt"; 
    ifstream fin; 
    fin.open(filename); 
    float d;// = 0.0; 
    int v = 0; 
    while (v < 21){ 
        fin>>d; 
        if(v >= 2 || v < 15){ 
            cout<<d<<endl;
        } 
        v++; 
    } 
}

输出为:1291次1291次

如何从这些文件转换为双倍而没有问题?谢谢!

5 个答案:

答案 0 :(得分:2)

你的代码有几个问题,但没有 解释你描述的症状(代码是不可能的 你发布了:你循环40次,并在循环中每次输出)。 无论如何:

        
  • 你有'if`错误的条件,所以它总是如此:     `v`总是大于2或小于15,
  •     
  • 你在'while`错误的情况下得到了条件;你正在尝试     阅读40个值,无论文件中包含哪些内容

你的循环可能应该是什么样的:

while ( fin >> d ) {
    if ( v >= 2 && v < 15 ) {
        std::cout << v << std::endl;
    }
    ++ v;
}

这将导致元素[2,15]显示,只要它们是 本。

如果您始终显示相同的值,则可能是输入 在那个值失败之后,鉴于你没有测试你的输入 成功与否。一个可能的探索是提到的一个moala 在一个注释中:当你打开一个文件时,它充满了当前的全局 语言环境。尝试:

fin.imbue(std::locale("C"));
打开文件后立即

;在大多数语言环境中,小数 separator是一个逗号,而不是一个点。 (另外:检查一下 成功了。)

答案 1 :(得分:1)

您会看到程序输出的最后15行,因为v变量在数据文件中的行数上继续增长。

while (v < 40)更改为while(v < 21),您将会看到您希望看到的内容。

答案 2 :(得分:1)

答案 3 :(得分:1)

作为快速健全检查,请尝试将整个文件复制到标准输出,如下所示:

#include <iostream>
#include <iterator>
#include <algorithm>

int main() {    
    std::ifstream in("mr1.txt");
    std::copy(std::istream_iterator<double>(in),
              std::istream_iterator<double>(),
              std::ostream_iterator<double>(std::cout, "\n"));
    return 0;
}

答案 4 :(得分:1)

到目前为止,James Kanze对如何遍历文件提供了最好的建议。但我很确定它应该是:

std::cout << d << std::endl;

否则你将打印出行号。

另外,我想指出你有很多不必要的内容。并不重要,但此时你真正需要的只是iostream和fstream。其他一切都过剩了。

最后一件事。如果您需要输入为双精度数,为什么要将它们放入浮点变量?