std::ifstream::read 或 std::ofstream::write 带有零参数?
std::ifstream::read or std::ofstream::write with a zero parameter?
调用:
mystream.read(buffer, 0);
或
mystream.write(buffer, 0);
(当然,不会读取或写入任何内容)。 我想知道在调用这两个函数之一之前是否必须测试提供的大小是否为空。
是的,行为是明确定义的:这两个函数都将经历未格式化输入/输出函数的动作(构造哨兵,如果设置了 eofbit 则设置 failbit,如有必要,刷新绑定流),然后它们将得到这个子句:
§27.7.2.3[istream.unformatted]/30
提取并存储字符,直到发生以下任一情况:
— 存储 n 个字符;
§27.7.3.7[ostream.unformatted]/5
插入字符,直到出现以下任一情况
— 插入 n 个字符;
"存储/插入零个字符"在存储或提取任何内容之前为 true。
查看实际实现,我看到libc ++中的for (; gcount < n; ++gcount)
或stdlibc ++中的sgetn(buffer, n);
具有等效循环
从27.7.2.3 Unformatted input functions/1
中提取的另一个数据为我们提供了零大小输入缓冲区有效案例的线索:
将非零大小的字符数组作为参数的无格式输入函数还应在数组的第一个位置存储一个空字符(使用 charT())。
相关文章:
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- 为什么 std::function 可以作为 std::not2 的参数?
- 传递给std::function template的template参数究竟代表什么
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 将函数参数"const char*"转换为"std::string_view"是
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 为什么 std::绑定错误参数可以成功?
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- std::vector 没有重载函数的实例与参数列表匹配
- std::span<const T> 作为函数模板中的参数
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 在构造函数中使用可变参数初始化 std::tuple
- 为什么我不能将引用作为 std::async 的函数参数传递
- 转发变量参数列表以模拟 std::thread
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 可变参数模板参数扩展 类型为 std::function 的类成员