C++如何读取ofstream::binary模式保存的二进制文件并输出内容
问题排查及修复方案
一、核心问题总述
你的代码从保存到读取逻辑全链路存在不匹配和语法错误,才导致没有输出甚至程序隐性崩溃,具体错误点如下:
二、分模块错误说明
1. 二进制保存函数错误
- 你并未将txt中的文本数字转为int类型的二进制存储,只是将文本字符串的ASCII值直接写入二进制文件,和后续读取逻辑中按int读取的规则完全不匹配
out.write((char*)temp, sizeof(temp))强制每次写255字节,不管每行实际读取的字符长度,写入内容包含大量无意义的空值/垃圾值,增加读取难度
2. 二进制读取函数错误
- 参数传递错误:
int *arr和int n都是值传递,函数内new的数组、计算的长度n都无法传回函数外部,外部调用时拿不到有效数据 - 元素个数计算错误:
n = size/sizeof(arr)中的arr是指针,32位系统下sizeof值为4、64位下为8,不是int类型的大小,正确应该除以sizeof(int) - 读取参数非法:
in.read((char*)number, sizeof(n))直接将int变量number的值转为内存地址访问,属于非法内存访问,会导致程序崩溃/读取失败,正确需要取number的地址&number,且读取长度应为sizeof(int)
三、修正后代码
保存函数(将txt文本数字转为int二进制存储)
void saveinbinary() { ifstream in("csdl.txt", ifstream::in); ofstream out("csdl.bin", ofstream::binary); int num; // 自动读取txt中的数字,跳过换行、空格等分隔符 while(in >> num) { out.write((char*)&num, sizeof(int)); } in.close(); out.close(); }
读取函数(按int二进制读取并输出)
// arr用二级指针、n用引用才能把值带出函数 void readbinary(int **arr, int &n) { ifstream in("csdl.bin", ifstream::binary); // 先判断文件是否打开成功,避免文件不存在、权限不足等问题 if(!in.is_open()) { std::cout << "二进制文件打开失败" << std::endl; return; } in.seekg(0, in.end); long size = in.tellg(); in.seekg(0); // 按int大小计算元素个数 n = size / sizeof(int); *arr = new int[n]; for (int i = 0; i < n; ++i) { int number; // 传入number的地址,读取对应长度的二进制内容 in.read((char*)&number, sizeof(int)); (*arr)[i] = number; } // 输出所有数字 for (int i = 0; i < n; ++i) { std::cout << (*arr)[i] << "\t"; } in.close(); }
调用示例
int main() { saveinbinary(); int *arr = nullptr; int n = 0; readbinary(&arr, n); // 用完释放堆内存避免泄漏 delete[] arr; return 0; }
内容的提问来源于stack exchange,提问作者thangvc91
相关产品推荐
相关产品推荐

