C++自定义类实现while(file>>event)编译报错,需实现什么?
解决C++自定义文件类在while循环中判断读取状态的问题
你的需求完全可行,只需要给MyFile类补充两个关键实现:
1. 确保operator>>返回MyFile&类型
你的operator>>重载必须返回文件对象的引用,这样才能在链式调用后,让文件对象参与后续的布尔判断。示例实现如下:
// 根据类设计选择全局或友元重载 MyFile& operator>>(MyFile& file, MyTimeEvent& event) { // 读取块标签逻辑 std::string tag; // 从file.in_读取标签数据(具体实现根据你的二进制格式调整) // ... if (tag != "TIME") { // 遇到非TIME块,设置流失败状态 file.in_.setstate(std::ios::failbit); return file; } // 读取TIME块数据到event对象 // ... return file; }
2. 给MyFile添加explicit operator bool()
这个运算符用来让MyFile对象在上下文需要布尔值时(比如while循环条件),转换为表示文件是否可继续操作的bool值。使用explicit可以避免隐式转换带来的意外问题,实现如下:
class MyFile { public: // ... 已有的方法 ... // 上下文转换为bool,判断文件是否处于有效可读状态 explicit operator bool() const { // 基于内部ifstream的状态判断:未失败且未到文件尾 return static_cast<bool>(in_) && !in_.eof(); } private: std::ifstream in_; };
工作逻辑说明
当你写while (file >> tEvent)时:
- 每次执行
file >> tEvent,会调用对应的operator>>读取TIME块 - 如果读取到非TIME块(比如VOLT块),
operator>>会设置in_的failbit - 循环条件会将返回的
MyFile&转换为bool,调用operator bool() - 当
failbit被设置时,operator bool()返回false,循环终止,此时文件指针正好指向VOLT块的起始位置,后续可以正常读取VOLT块
内容的提问来源于stack exchange,提问作者Matteo Brini
相关产品推荐
相关产品推荐

