C++读取二进制文件打印内容异常,求问题原因及代码排查
二进制文件读写异常问题排查
你的代码存在两处关键问题,同时还有潜在风险,导致读取后输出全为0:
核心问题分析
文件打开模式不明确
使用fstream打开文件读取时,仅指定ios::binary是不够的。fstream默认打开模式为ios::in | ios::out,这种模式可能因系统或编译器差异导致文件指针位置异常,或打开逻辑不符合预期,最终引发读取失败。未检查文件是否成功打开
读写文件前均未验证文件是否打开成功。如果因权限不足、路径错误(比如程序运行目录与预期不符)等原因导致文件打开失败,后续读写操作会直接无效,buffer将保持初始化的0值。
修正后的代码
#include<iostream> #include<fstream> #include<string> using namespace std; const int MAX = 80; int main(){ int buffer[MAX]; for (int i = 0 ; i < MAX ; i++){ buffer[i] = i; } ofstream winfile; winfile.open("text.dat", ios::binary); // 检查写入文件是否成功打开 if (!winfile.is_open()) { cerr << "无法打开写入文件!" << endl; return 1; } winfile.write(reinterpret_cast<char*>(buffer), MAX * sizeof(int)); winfile.close(); fstream rinfile; // 明确指定读取模式 + 二进制模式 rinfile.open("text.dat", ios::in | ios::binary); // 检查读取文件是否成功打开 if (!rinfile.is_open()) { cerr << "无法打开读取文件!" << endl; return 1; } for (int i = 0 ; i < MAX ; i++){ buffer[i] = 0; } rinfile.read(reinterpret_cast<char*>(buffer), MAX * sizeof(int)); // 验证读取的字节数是否符合预期 if (rinfile.gcount() != MAX * sizeof(int)) { cerr << "读取数据不完整,仅读取了 " << rinfile.gcount() << " 字节" << endl; } rinfile.close(); for (int i = 0 ; i < MAX ; i++){ cout << buffer[i] << " "; } cout << endl; return 0; }
额外注意事项
- 文件路径验证:确保程序运行的当前目录与预期一致,避免读写的不是同一个文件。可通过
getcwd函数输出当前目录路径进行验证。 - 权限检查:确认程序对目标目录有读写权限,尤其是在Linux/macOS系统下,避免因权限不足导致操作失败。
内容的提问来源于stack exchange,提问作者DEADPØØL GAMING
相关产品推荐
相关产品推荐

