【发布时间】:2014-04-21 02:57:54
【问题描述】:
我有一个 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 的文档中没有提到这种行为。任何进一步的帮助将不胜感激:)
我目前的解决方法是在复制后寻找 1 个额外元素 - 但这显然不理想。
【问题讨论】:
-
@JoachimPileborg:你肯定是指
std::istreambuf_iterator<char>和std::ostreambuf_iterator<char>。尤其是输入端很重要,因为std::istream_iterator<char>会跳过空格。此外,...buf...版本更高效,因为它们不会为每个对象创建sentry。 -
谢谢大家 - 这似乎对我有用 :) 如果你们中的某个人想把它作为答案发布,我很乐意给你打勾。
-
回复。您的编辑,检查
get是否成功。 -
您注意到的问题似乎是标准中的规范不足:标准声明
n元素被复制,但它没有声明输入和输出迭代器需要增加n次!例如,查看 libstdc++ 中的实现表明源代码没有增加n次!对于 InputIterator 以外的其他迭代器类别,这无关紧要,但对于 InputIterator 却是。