C++ 从istream读取二进制数据时如何获取EOF后的实际读取长度
C++ istream 批量读取缓冲区的实现方案
不需要逐字符读取,你可以通过std::istream内置的gcount()方法直接获取上一次读取操作的实际字节数,完美解决EOF场景下的长度统计问题。
修正后的实现代码
char buffer[128]; // 直接判断流状态即可覆盖正常读取、EOF、读取异常等场景 while (is) { is.read(buffer, sizeof(buffer)); // 无需单独判断EOF,gcount会自动返回实际读取的有效字节数 size_t read_len = is.gcount(); if (read_len > 0) { process(buffer, read_len); } }
核心说明
std::istream::gcount()专门用于统计上一次无格式输入操作(包括read、get、getline等)实际读取的字节数,无论读取是否碰到EOF都能返回正确值,不需要手动计算长度。- 原逻辑中需要补全的
xxxx位置,直接替换为is.gcount()即可正常运行,上述优化后的写法逻辑更统一,不需要单独做EOF分支判断。 read方法本身就是批量读取的最优实现,即使碰到EOF,已经读取到缓冲区的有效数据也不会丢失,完全不需要逐字节读取。- 若需要区分正常读完和读取异常,可以在循环结束后判断
is.eof()的返回值,返回true代表流内容已经全部读取完成,否则为读取过程中出现异常。
内容的提问来源于stack exchange,提问作者uuu777
相关产品推荐
相关产品推荐

