我有一个istream(ifstream,在这种情况下),我想从中将特定数量的字符写入ostream(cout,具体而言)。
我可以看到使用像istream.get()这样的东西是可能的,但这会创建一个中间缓冲区,这是我宁愿避免的。
类似的东西:
size_t numCharacters = 8;
ostream.get(istream, numCharacters);
有人能指出我正确的方向吗?
感谢阅读:)
编辑:添加了c ++标签 编辑:固定标题:/
新编辑:
非常感谢答案的人。作为旁注,任何人都可以解释copy_n这种奇怪的行为吗?基本上它似乎不消耗从输入流复制的最后一个元素,即使该元素出现在输出流中。下面的代码应该说明:
string test = "testing the weird behaviour of copy_n";
stringstream testStream(test);
istreambuf_iterator<char> inIter( testStream );
ostream_iterator<char> outIter( cout );
std::copy_n(inIter, 5, outIter);
char c[10];
testStream.get(c,10);
cout << c;
我得到的输出是:
见证w
我期望的输出是:
测试我们
cppreference.com上的文档中没有提到这种行为。任何进一步的帮助将不胜感激:)
我目前的解决方法是在复制后寻找一个额外的元素 - 但这显然不太理想。
答案 0 :(得分:2)
如果要限制要高效的字符数和,则无法避免复制字节。对于没有缓冲区的慢速版本,您可以使用std::copy_n()
:
std::copy_n(std::istreambuf_iterator<char>(in),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>(out),
n);
我很确定这比读取缓冲区或其序列并写入缓冲区要慢得多(BTW请务必调用std::ios_base::sync_with_stdio(false)
,否则可能会很慢std::cout
)的所有内容。
您还可以创建一个过滤流缓冲区,即使用另一个流缓冲区作为其数据源从std::streambuf
派生的类。过滤器将在n
字符后指示不再有字符。它内部仍然使用缓冲区,因为字符的单独处理很慢。然后它可以用作:
limitbuf buf(in, n);
out << &buf;