读取文件的内容并使用std :: copy将它们存储在向量中

时间:2014-02-06 16:47:10

标签: c++ stl

我有以下代码:

    std::istream_iterator<std::string> eos;              
    std::istream_iterator<std::string> iit (File);
    std::vector<std::string> result;
    std::copy(iit,eos,std::back_inserter(result));
    for(auto it=result.begin(); it!=result.end(); ++it )
        std::cout << *it << std::endl;

我正在使用迭代器来读取File的内容并将结果存储到我的向量中,我不想使用任何whilefor循环,我我想只使用任何STL函数来执行此操作,因此我尝试了copy。该文件的内容采用以下形式:

Pork bone:4
Pigs trotters:4
Loin of pork:4

问题是前面的代码读取每一行直到空格或换行符,所以我的向量看起来像:

Pork
bone:4
Pigs
trotters:4
Loin
of
pork:4

我希望每一行都是我向量中的一个新元素,任何想法如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

看起来在How do I iterate over cin line by line in C++?

已经存在堆栈溢出的示例

引用相关位:“

class line {
    std::string data;
public:
    friend std::istream &operator>>(std::istream &is, line &l) {
        std::getline(is, l.data);
        return is;
    }
    operator std::string() const { return data; }    
};

例如,要将文件中的所有行读成字符串向量,可以使用以下内容:

std::vector<std::string> lines;

std::copy(std::istream_iterator<line>(std::cin), 
          std::istream_iterator<line>(),
          std::back_inserter(lines));

” 免责声明:我自己没有尝试过这个,我只是基于他的声誉等信任Jerry Coffin。

答案 1 :(得分:1)

您可以创建自己的基于行的迭代器:

template<typename T>
class line_iterator
    : public std::iterator<std::input_iterator_tag, T>
{
public:
    typedef std::istream istream_type;
    typedef T value_type;

    line_iterator(istream_type& is) : ptr(&is) { getInput(); }
    line_iterator() : ptr(nullptr) { }

    T const& operator*() const
    {
        return value;
    }

    line_iterator& operator++()
    {
        getInput();
        return *this;
    }

    T* operator->()
    {
        return &value;
    }

    line_iterator operator++(int)
    {
        line_iterator copy(*this);
        ++*this;
        return copy;
    }

    friend bool operator==(const line_iterator& lhs, const line_iterator& rhs)
    {
        return lhs.ptr == rhs.ptr;
    }

    friend bool operator!=(const line_iterator& lhs, const line_iterator& rhs)
    {
        return !(lhs == rhs);
    }
private:
    T value;
    istream_type* ptr;

    void getInput()
    {
        if (ptr)
        {
            if (!std::getline(*ptr, value)) ptr = nullptr;
        }
    }
};

现在你可以做到:

std::copy(line_iterator<std::string>(File),
          line_iterator<std::string>(), std::back_inserter(result));

答案 2 :(得分:0)

似乎除了使用std :: getline和相同的while循环之外别无他法。

答案 3 :(得分:0)

不是使用istream_iterator,最好的办法是使用istream :: getline函数。

getline vs istream_iterator

http://www.cplusplus.com/reference/istream/istream/getline/