8

我正在尝试将存储在不同行中的未知数量的双精度值从文本文件读取到一个名为rainfall. 我的代码无法编译;我收到了no match for 'operator>>' in 'inputFile >> rainfall'while 循环行的错误。我了解如何从文件读入数组,但我们需要为这个项目使用向量,但我不明白。我很感激你能给我下面的部分代码的任何提示。

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
4

5 回答 5

14

我认为您应该将其存储在 type 的变量中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()检索向量中的项目数。

于 2013-10-26T03:18:14.687 回答
13

您不能使用>>运算符来读取整个向量。您需要一次读取一项,并将其推送到向量中:

double v;
while (inputFile >> v) {
    rainfall.push_back(v);
}

您不需要计算条目,因为rainfall.size()会给您准确的计数。

最后,最 C++ 式的读取向量的方法是使用 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));
于 2013-10-26T03:18:44.193 回答
8

你也可以这样做:

#include <algorithm>
#include <iterator>

...
std::istream_iterator<double> input(inputFile);
std::copy(input, std::istream_iterator<double>(),    
          std::back_inserter(rainfall));
...

假设你喜欢 STL。

于 2013-10-26T03:52:21.380 回答
6

输入运算符>>未定义用于将doubles 输入到 astd::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;
于 2013-10-26T03:44:47.017 回答
1

考虑使用这个输入阅读器:

#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;
}

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

于 2018-07-16T05:48:24.600 回答