Discussion:
std::istreambuf_iterator и std::copy
(слишком старое сообщение для ответа)
Maxim Cherniavsky
2004-02-03 16:23:35 UTC
Permalink
Требуется вывести на стандартный вывод N-символов файла используя
std::istreambuf_iterator и std::copy

Код:

std::ifstream iS;
iS.open("file");
std::istreambuf_iterator<char> in(iS);

std::copy(in, "итератор на N-ый символ",
std::ostreambuf_iterator<char>(std::cout));

как получить "итератор на N-ый символ"?

пробовал
std::advance(std::istreambuf_iterator<char>(iS), N);
но при жтом текущая позиция в iS судя по всему тоже сдвигаетя

Вообще невозможно, или я что то проглядел?

P.S. В SGI варианте STL присутствует функция copy_n, которая видимо
делает то что нужно :(
--
Best regards,
Maxim Cherniavsky
Sergiy Kanilo
2004-02-03 18:20:16 UTC
Permalink
"Maxim Cherniavsky" <***@mtu.ru> wrote:

MC> Требуется вывести на стандартный вывод N-символов файла используя
std:::istreambuf_iterator и std::copy

std:::ifstream iS;
MC> iS.open("file");
std:::istreambuf_iterator<char> in(iS);

std:::copy(in, "итератор на N-ый символ",
std:::ostreambuf_iterator<char>(std::cout));

MC> как получить "итератор на N-ый символ"?

для input итератора - только прочитав предыдущие N-1 символов

MC> пробовал
std:::advance(std::istreambuf_iterator<char>(iS), N);
MC> но при жтом текущая позиция в iS судя по всему тоже сдвигаетя

конечно, ибо реализуется это через ++

MC> Вообще невозможно, или я что то проглядел?

ИМХО тут имеется в виду какой-то трюк,
ибо ни для input ни для output итераторов поддиапазонов
длины N, которое требуется для лобового примерения copy,
не существует, возможен только полный входной диапазон

и потому надо что-то добавить, что будет отсчитывать
эти самые N, например

1) ручками обрезать файл до N позиций :)
2) переопределить streambuf котрый будет то же самое что и 1)
3) написать раппер для std:::istreambuf_iterator который будет
заниматься отсчетом

все эти варианты гораздо сложнее отказа от std::copy
и замены ее циклом со счетчиком

MC> P.S. В SGI варианте STL присутствует функция copy_n, которая видимо
MC> делает то что нужно :(

ну так у нее наверное отдельный счетчик имеется

Cheers,
Serge

Loading...