basic_ios :: clear:管道传入文件时抛出iostream错误

时间:2017-02-20 16:55:56

标签: c++ exception pipe file-read

我遇到的情况我不太清楚在哪里找问题的原因,因为问题似乎只发生在将终端的程序输出汇总到文件中时我不知道是什么这可能与我的代码本身有关。此外,这只适用于较大的文件而不适用于较小的文件;

我用输出迭代器编写了一个文件阅读器类:

#include <fstream>
#include <iostream>
#include <limits>

class Filereader
{
private:
    std::fstream file;

    class output_iterator
    {

    public:
        output_iterator(std::fstream& file, int line_number)
          : file(file), line_number(line_number)
        {
            if (line_number == 0 || line_number == -1) {
            } else {
                go_to_line(line_number);
            }
        }

        const std::string& operator*() const { return line; }

        output_iterator& operator++()
        {
            if (file.good()) {
                getline(file, line);
                line_number++;
            } else {
                line_number = -1;
            }
            return *this;
        }

        friend bool operator!=(const output_iterator& lhs,
                               const output_iterator& rhs)
        {
            return !(lhs == rhs);
        }

        friend bool operator==(const output_iterator& lhs,
                               const output_iterator& rhs)
        {
            if (&lhs.file != &rhs.file)
                throw(std::invalid_argument("file operands do not match"));
            return lhs.line_number == rhs.line_number;
        }

    private:
        void go_to_line(size_t num)
        {
            file.seekg(0, std::ios::beg);
            for (size_t i = 0; i < num - 1; ++i) {
                file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            }
        }

    private:
        std::fstream& file;
        std::string   line;
        int           line_number;
    };

public:
    Filereader(const std::string& filename)
    {
        file.exceptions(std::fstream::failbit | std::fstream::badbit);
        try {
            file.open(filename, std::ios::in);
        } catch (const std::fstream::failure& e) {
            std::cerr << "exception opening file '" + filename + "'"
                      << "\n";
        }
    }

    output_iterator begin() { return output_iterator(file, 0); }
    output_iterator end() { return output_iterator(file, -1); }
};

我的测试程序是这样的:

int main(int argc, char** argv){

    Filereader fr(argv[1]);

    for (auto i = fr.begin(); i != fr.end(); ++i){
        std::cout << *i << "\n";
    }
}

现在,管道输出实际上已成功通过,但之后会抛出以下错误:

terminate called after throwing an instance of 'std::ios_base::failure[abi:cxx11]'
  what():  basic_ios::clear: iostream error

如上所述,这只适用于较大的文件。

当没有管道输出时,没有抛出错误...... 我可能在这里遗漏了一些非常明显的东西,但我不知道在哪里寻找原因。

0 个答案:

没有答案