将.txt文件中的双精度文件读入双数组c ++

时间:2014-06-21 03:21:48

标签: c++ file-io

我试图创建一个需要大量股票价格的程序。我将这些价格存储在.txt文件中,每行一个双。有一个未知的数字(可能是数千)。我无法将数据转换为可以操作的数组。我现在几个小时都无法解决这个问题。每当我尝试从文件中读取数据然后将其转换为double时,我会遇到奇怪的线程错误并且程序挂起。任何人都可以告诉我如何将未知数量的双打读入阵列。

string line;
vector<double> doubles;

fstream myfile ("/Users/jaychinnaswamy/Documents/PMHistory.txt",std::ios_base::in);

int x=0;
float a;
while (myfile >> a)
{
    doubles[x]=a;
}

文件结构的一个例子是:

50.4000000000000

50.8000000000000

50.5000000000000

50.2100000000000

49.1500000000000

48.5000000000000

由于

3 个答案:

答案 0 :(得分:4)

您已在此处创建空向量

vector<double> doubles;

在这里,您正在索引向量,就像它不为空一样。它仍然是空的,您正在访问无效元素。

doubles[x]=a;

将该代码更改为使用std::vector::push_back()

doubles.push_back(a);

答案 1 :(得分:3)

我看到的代码中显而易见的两件事(已在评论中提到):

  1. 您不会增加x
  2. 即使没有增加,当双打没有元素时,您可以使用x == 0访问doubles[x]。这是未定义的行为。您需要提前分配元素或使用push_back根据需要增长向量。

答案 2 :(得分:1)

您提交的代码存在一些问题。正如其他人所说,您已经实例化了一个空std::vector,并且您的代码会对不存在的索引进行分配。由于您的问题围绕未知数量的元素(动态大小),因此请使用push_back的{​​{1}}方法。我建议您不要从std::vector转换为floatdouble。您知道数据为a,并且您希望将其存储为double,因此请使用double。由于这只是代码的一部分,因此您可以利用double循环使for范围与数据加载绑定。

您的代码可以重写为:

double a

但是,如果您不需要数据验证,您知道该文件只包含双精度数,而您实际上只想导入数字,然后使用std::ifstream myfile("/Users/jaychinnaswamy/Documents/PMHistory.txt"); std::vector<double> doubles; for (double a; myfile >> a;) { doubles.push_back(a); } 的范围构造函数来读取文件你通过std::vector

std::istream_iterator

特别注意#include <fstream> #include <iostream> #include <iterator> #include <vector> int main() { std::ifstream myfile("/Users/jaychinnaswamy/Documents/PMHistory.txt"); std::vector<double> doubles{(std::istream_iterator<double>(myfile)), std::istream_iterator<double>()}; } 范围构造函数的第一个迭代器参数周围的()。如果没有std::vector,则会导致语法歧义,也称为the "most vexing parse"