我试图创建一个需要大量股票价格的程序。我将这些价格存储在.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
由于
答案 0 :(得分:4)
您已在此处创建空向量。
vector<double> doubles;
在这里,您正在索引向量,就像它不为空一样。它仍然是空的,您正在访问无效元素。
doubles[x]=a;
将该代码更改为使用std::vector::push_back()
。
doubles.push_back(a);
答案 1 :(得分:3)
我看到的代码中显而易见的两件事(已在评论中提到):
x
。doubles[x]
。这是未定义的行为。您需要提前分配元素或使用push_back
根据需要增长向量。答案 2 :(得分:1)
您提交的代码存在一些问题。正如其他人所说,您已经实例化了一个空std::vector
,并且您的代码会对不存在的索引进行分配。由于您的问题围绕未知数量的元素(动态大小),因此请使用push_back
的{{1}}方法。我建议您不要从std::vector
转换为float
到double
。您知道数据为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"。