直接使用c++流缓冲区

问题描述 投票:0回答:1

这是一个改进版的 这个问题. 我希望我成功地用一个例子把我的问题说得更清楚。

下面的程序将对一个文本文件进行流式处理并打印其内容。

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() 如我所希望的那样调用保存一份?

EDIT:另一方面,考虑这个程序。

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, 被设置为流的内部缓冲区, 从来没有被触动过. 这意味着我不明白内部流缓冲区什么时候被真正使用。

c++ stream
1个回答
0
投票

在我看来,你的程序看起来不错,但你实际上使用了依赖于实现的行为。std::cout.write(my_buffer, Buffer_size); 可能会做一个副本内 std::cout 内部缓冲区(撰写信息)

我更倾向于用操作系统的功能来实现你想做的事情。

© www.soinside.com 2019 - 2024. All rights reserved.