从文件中读取整数到C ++中的向量

时间:2013-10-26 03:14:40

标签: c++ vector

我正在尝试将存储在文本文件中不同行上的未知数量的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

5 个答案:

答案 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;
}

它还允许您使用其他流类型,并且在类型读取上是通用的。