【发布时间】:2020-04-29 09:24:58
【问题描述】:
这是this question 的改进版本。我希望我通过一个例子成功地让我的问题更清楚。
以下程序将流式传输文本文件并打印其内容:
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 从未被触及。这意味着我不明白何时实际使用内部流缓冲区。
【问题讨论】: