我在从文件中读取并将内容转换为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次
如何从这些文件转换为双倍而没有问题?谢谢!
答案 0 :(得分:2)
你的代码有几个问题,但没有 解释你描述的症状(代码是不可能的 你发布了:你循环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)
std::cout << d << std::endl;
否则你将打印出行号。
另外,我想指出你有很多不必要的内容。并不重要,但此时你真正需要的只是iostream和fstream。其他一切都过剩了。
最后一件事。如果您需要输入为双精度数,为什么要将它们放入浮点变量?