8

別の行に格納されている不明な数の double 値を、テキスト ファイルから というベクトルに読み込もうとしています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 が指摘しているように、変数を使用する必要はありませんcountrainfall.size()ベクター内の項目数を取得するために使用します。

于 2013-10-26T03:18:14.687 に答える
13

>>演算子を使用してベクトル全体を読み取ることはできません。一度に 1 つのアイテムを読み取り、ベクターにプッシュする必要があります。

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 に答える
6

s を aに入力するための入力演算子>>が定義されていません。doublestd::vector

代わりstd::vectorに、入力ファイルの 2 つのトークン化入力イテレータを使用して構築します。

以下は、わずか 2 行のコードを使用して実行する方法の例です。

std::ifstream inputFile{"/home/shared/data4.txt"};
std::vector<double> rainfall{std::istream_iterator<double>{inputFile}, {}};

もう 1 つの解決策は、入力演算子関数を次のように定義することです。

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 に答える