basic_ios :: clear: ошибка iostream, возникающая при передаче в файл

Я сталкиваюсь с ситуацией, в которой я не совсем знаю, где искать причину проблемы, так как проблема, кажется, возникает только при передаче выходных данных программы из терминала в файл, и я понятия не имею, что это может иметь делать с моим кодом сам. Кроме того, это происходит только для больших файлов, а не для маленьких;

Я написал класс для чтения файлов с выходным итератором:

#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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]