Напрямую использовать буфер потока c ++ - PullRequest
0 голосов
/ 29 апреля 2020

Это улучшенная версия этого вопроса . Я надеюсь, что мне удалось прояснить мой вопрос на примере.

Следующая программа будет транслировать текстовый файл и распечатывать его содержимое:

size_t constexpr Buffer_size = 8;

char my_buffer[Buffer_size];

std::ifstream stream("text.txt");

for (; stream;) {
    stream.read(my_buffer, Buffer_size)
    std::cout.write(my_buffer, stream.gcount());
}

// output
// Lorem ipsum dolor sit amet, consectetur adipiscing elit. In mi risus, eleifend ac sapien sed, sollicitudin auctor neque.

Насколько я могу судить, поток будет иметь внутренний буфер, который он заполняет, после чего блоки копируются в my_buffer. my_buffer используется только кратко, в этом случае для печати, до того, как оно будет перезаписано снова.

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

size_t constexpr Buffer_size = 8;

char my_buffer[Buffer_size];

std::ifstream stream;
stream.rdbuf()->pubsetbuf(my_buffer, Buffer_size);
stream.open("text.txt");

for (; stream;) {
    stream.peek();
    std::cout.write(my_buffer, Buffer_size);
    stream.ignore(Buffer_size);
}

// output
// Lorem i.psum do.lor sit. amet, .consect.etur ad.ipiscin. In mi .risus, .eleifen.d ac sa.pien se.d, soll.icitudi.r neque..
// neque..
// neque.

Может ли эта идея работать? Сохраняет ли пропущенный вызов read() копию, как я надеюсь?

РЕДАКТИРОВАТЬ: С другой стороны, рассмотрим эту программу:

size_t constexpr Buffer_size = 8;

char my_buffer_a[Buffer_size];
char my_buffer_b[Buffer_size];

std::memset(my_buffer_a, 'A´, Buffer_size);

std::ifstream stream;
stream.rdbuf()->pubsetbuf(my_buffer_a, Buffer_size);
stream.open("text.txt");

for (; stream;) {
   stream.read(my_buffer_b, Buffer_size);
   std::cout.write(my_buffer_a, Buffer_size);
}

// output  
// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...

Вывод предполагает, что my_buffer_a, который устанавливается как внутренний буфер потока, никогда не трогается. Это означает, что я не понимаю, когда фактически используется внутренний буфер потока.

1 Ответ

0 голосов
/ 29 апреля 2020

Ваша программа выглядит хорошо для меня, но вы на самом деле используете поведение, зависящее от реализации. Вы должны сохранить одну копию, но std::cout.write(my_buffer, Buffer_size);, вероятно, сделает копию во внутреннем буфере std::cout ( запись информации )

Я бы предпочел работать с функциями ОС, чтобы достичь того, что вы пытаюсь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...