如何将ifstream中的字符串优雅地复制到vector <string>?</string>

时间:2013-02-06 02:19:00

标签: c++ algorithm copy iostream fstream

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    ifstream fin("test.txt");

    vector<string> coll;

    typedef istreambuf_iterator<char> IStrBufIter;
    copy(IStrBufIter(fin), IStrBufIter(), back_inserter(coll)); // Error! Why?
}

问题在代码中被注释。

我得到的错误是:

oi.cpp:15:62:   required from here
error: invalid user-defined conversion from ‘std::istreambuf_iterator<char, std::char_traits<char> >::char_type {aka char}’ to ‘std::vector<std::basic_string<char> >::const_reference {aka const std::basic_string<char>&}’ [-fpermissive]

以下错误消息太多,无法在此处粘贴。请参阅gcc 4.7 http://pastebin.com/anKQqL00

上的错误消息

2 个答案:

答案 0 :(得分:4)

考虑copy正在做什么。它反复拨打coll.push_back(someChar);

collstrings的向量。您正试图将char推入其中。您无法从string构建char

此外,您应该在istream_iterator使用istreambuf_iterator,而不是coll。您可以将char设为istream_iterator<char>的向量,或者如果您的目标是将文件中的每个单词都放入字符串向量中(我怀疑您可能是这样),您可以更改{{1}转到istream_iterator<string>

或者,更好的是,您可以使用迭代器首先构造向量:

 vector<string> coll(istream_iterator<string>(fin), istream_iterator<string>());

答案 1 :(得分:3)

如果你想把文件的内容放到一个向量中,只需循环遍历它。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    ifstream fin("test.txt");

    vector<string> coll;
    string str;
    while(getline(fin,str))
        coll.push_back(str);
}

可能更容易处理和不言自明。