调用是否完全可以(=根据标准定义明确的行为):
mystream.read(buffer, 0);
或者
mystream.write(buffer, 0);
(当然不会读取或写入任何内容)。我想知道在调用这两个函数之一之前是否必须测试提供的大小是否为空。
调用是否完全可以(=根据标准定义明确的行为):
mystream.read(buffer, 0);
或者
mystream.write(buffer, 0);
(当然不会读取或写入任何内容)。我想知道在调用这两个函数之一之前是否必须测试提供的大小是否为空。
是的,行为是明确定义的:两个函数都将通过未格式化的输入/输出函数的动作(构造哨兵,如果设置了 eofbit,则设置失败位,必要时刷新绑定流),然后它们将进入此子句:
§27.7.2.3[istream.unformatted]/30
字符被提取和存储,直到发生以下任一情况:
— 存储 n 个字符;
§27.7.3.7[ostream.unformatted]/5
插入字符直到出现以下任一情况
— 插入 n 个字符;
在存储或提取任何内容之前,“存储/插入零个字符”为真。
查看实际实现,我for (; gcount < n; ++gcount)
在 libc++或sgetn(buffer, n);
stdlibc++中看到了等效循环
另一个提取27.7.2.3 Unformatted input functions/1
为我们提供了一个线索,即零大小的输入缓冲区是有效的情况:
以非零大小的字符数组作为参数的未格式化输入函数还应在数组的第一个位置存储一个空字符(使用 charT())。