我正在尝试将存储在文本文件中不同行上的未知数量的double值读入名为rainfall
的向量中。我的代码不会编译;我收到了while循环行的错误no match for 'operator>>' in 'inputFile >> rainfall'
。我理解如何从一个文件读入一个数组,但我们需要使用矢量这个项目,我没有得到它。我感谢您在下面的部分代码中提供的任何提示。
vector<double> rainfall; // a vector to hold rainfall data
// open file
ifstream inputFile("/home/shared/data4.txt");
// test file open
if (inputFile) {
int count = 0; // count number of items in the file
// read the elements in the file into a vector
while ( inputFile >> rainfall ) {
rainfall.push_back(count);
++count;
}
// close the file
答案 0 :(得分:10)
我认为你应该将它存储在double
类型的变量中。看起来你正在向>>
做一个无效的向量。请考虑以下代码:
// open file
ifstream inputFile("/home/shared/data4.txt");
// test file open
if (inputFile) {
double value;
// read the elements in the file into a vector
while ( inputFile >> value ) {
rainfall.push_back(value);
}
// close the file
正如@ legends2k指出的那样,您不需要使用变量count
。使用rainfall.size()
检索向量中的项目数。
答案 1 :(得分:10)
您不能使用>>
运算符来读取整个向量。您需要一次读取一个项目,并将其推入向量:
double v;
while (inputFile >> v) {
rainfall.push_back(v);
}
您无需计算条目,因为rainfall.size()
会为您提供准确的计数。
最后,大多数C ++ -ish读取向量的方法是使用istream迭代器:
// Prepare a pair of iterators to read the data from cin
std::istream_iterator<double> eos;
std::istream_iterator<double> iit(inputFile);
// No loop is necessary, because you can use copy()
std::copy(iit, eos, std::back_inserter(rainfall));
答案 2 :(得分:5)
你也可以这样做:
#include <algorithm>
#include <iterator>
...
std::istream_iterator<double> input(inputFile);
std::copy(input, std::istream_iterator<double>(),
std::back_inserter(rainfall));
...
假设您喜欢STL。
答案 3 :(得分:4)
未定义输入操作符>>
以将double
输入std::vector
。
而是使用两个用于输入文件的标记化输入迭代器构造std::vector
。
以下是使用仅使用2行代码来完成此操作的示例:
std::ifstream inputFile{"/home/shared/data4.txt"};
std::vector<double> rainfall{std::istream_iterator<double>{inputFile}, {}};
另一种解决方案是将输入操作符函数定义为:
std::istream& operator>> (std::istream& in, std::vector<double>& v) {
double d;
while (in >> d) {
v.push_back(d);
}
return in;
}
然后你可以在你的例子中使用它:
std::vector<double> rainfall;
inputFile >> rainfall;
答案 4 :(得分:0)
考虑使用此输入阅读器:
#include <iterator>
#include <algorithm>
#include <vector>
#include <iostream>
#include <fstream>
template<typename T>
std::vector<T> parse_stream(std::istream &stream) {
std::vector<T> v;
std::istream_iterator<T> input(stream);
std::copy(input, std::istream_iterator<T>(), std::back_inserter(v));
return v;
}
int main(int argc, char* argv[])
{
std::ifstream input("/home/shared/data4.txt");
std::vector<int> v = parse_stream<int>(input);
for(auto &item: v) {
std::cout << item << std::endl;
}
return 0;
}
它还允许您使用其他流类型,并且在类型读取上是通用的。