You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:55:38