簡體   English   中英

std :: getline不接受std :: back_insert_iterator

[英]std::getline does not accept std::back_insert_iterator

int main() { 
    std::deque<std::string> mydeque;
    std::back_insert_iterator<decltype(mydeque)> myback_insert_iterator(mydeque);
    std::ifstream myifstream("test.txt");
    while(std::getline(myifstream, *myback_insert_iterator)) {
    }
}

我只想將文本文件逐行讀入字符串容器。 這會產生編譯錯誤:

C2784:無法從'std :: ifstream'推斷'std :: basic_istream <_Elem,_Traits>&'的模板參數

怎么了?

嘗試:

int main()
{
    std::deque<std::string> mydeque;
    std::ifstream myifstream("test.txt");

    std::string line;
    while(std::getline(myifstream, line)
    {
        mydeque.push_back(line);
    }
}

如果每行一個單詞,您可以簡化為:

int main()
{
    std::deque<std::string> mydeque;
    std::ifstream myifstream("test.txt");

    // Note: istream_iterator<T> uses std::istream& operator>>(std::istream&, T&) to
    //       read data from the stream. If `T` is a std::string this means it will
    //       read a single space separated word.

    std::copy(std::istream_iterator<std::string>(myifstream),
              std::istream_iterator<std::string>(),
              std::back_inserter(mydeque)
             );
}

如果每行包含多個單詞並且您想使用后插入器,那么您需要定義一個類來讀取可以與迭代器一起使用的對象中的整行:

struct Line
{
    std::string data;
    operator std::string const&() const {return data;}

    friend std::istream& operator>>(std::istream& s, Line& dst)
    {
        return std::getline(s, dst.data);
    }
};

int main()
{
    std::deque<std::string> mydeque;
    std::ifstream myifstream("test.txt");

    std::copy(std::istream_iterator<Line>(myifstream),
              std::istream_iterator<Line>(),
              std::back_inserter(mydeque)
             );
}

或者我們可以使用構造函數:

int main()
{
    std::ifstream myifstream("test.txt");
    std::deque<std::string> mydeque(std::istream_iterator<Line>(myifstream),
                                    (std::istream_iterator<Line>()));
    // Note: Extra brace required around second iterator here
    //       This is to avoid the problem with the `Most Vexing Parse`
    //       Which would otherwise make this a function declaration

}

getline需要一個字符串,而不是輸出迭代器。 您可以將myifstream包裝到輸入迭代器中並使用std::copy 像這樣:

#include <deque>
#include <fstream>
#include <algorithm>
#include <iterator>

int main() {
    std::deque<std::string> mydeque;
    std::back_insert_iterator<decltype(mydeque)> myback_insert_iterator(mydeque);
    std::ifstream myifstream("test.txt");
    std::istream_iterator<std::string> i_it(myifstream), eos;
    std::copy(i_it, eos, myback_insert_iterator);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM