C++无法两次读取结构体二进制文件的问题及解决方法
二进制文件两次读取失败:第二次循环被跳过的解决方法
读取存储结构体的二进制文件时,第一次读取循环能正常执行并输出内容,但第二次读取循环会被完全跳过,无法执行。
问题原因
第一次读取到文件末尾时,文件流会触发eofbit(文件结束标志),同时可能设置failbit等错误状态位。这些状态位会锁定文件流的IO操作,即便调用seekg(0, ios::beg)把读取指针移回文件开头,错误状态依然存在,导致第二次read操作直接失败,循环无法进入。
解决方法
在重置文件指针之前,必须调用file.clear()清除文件流的所有错误状态位,让文件流恢复到可操作状态。之后再用seekg和seekp将读写指针移回文件起始位置,就能正常执行第二次读取了。
修正后的完整代码
#include <iostream> #include <fstream> #include <iomanip> // 包含std::setw using namespace std; int main() { cout << "\n Hello world!" << endl; struct STRUCT{ int x; int y; }; STRUCT myStruct; fstream file; file.open("c:read.dat",std::fstream::binary | std::fstream::in | std::fstream::out); // 第一次读取 while(file.read(reinterpret_cast<char*>(&myStruct),sizeof(STRUCT))){ cout << "\n" << setw(14) << "t1" << setw(14) << "t1";// 测试输出 cout << "\n" << setw(14) << myStruct.x << setw(14) << myStruct.y ; }; // 清除错误状态位是关键操作 file.clear(); // 重置读写指针到文件开头 file.seekg(0, ios::beg); file.seekp(0, ios::beg); // 第二次读取 while(file.read(reinterpret_cast<char*>(&myStruct),sizeof(STRUCT))){ cout << "\n" << setw(14) << "q" << setw(14) << "q";// 测试输出 cout << "\n" << setw(14) << myStruct.x << setw(14) << myStruct.y ; }; cout << "\n The End"; return 0; }
内容的提问来源于stack exchange,提问作者Need_Help
相关产品推荐
相关产品推荐

