C++从文件读取二维数组输出异常排查及循环代码复用问题咨询
问题原因与解决方案
1. 读取到奇怪数值的问题
你读取到的奇怪数值不是内存地址,属于内存中的随机垃圾值,由两个核心原因导致:
- 写入文件时没有添加数值分隔符:多个数值直接拼接为连续字符串,比如
3和-5直接拼接为3-5,读取时会被识别为单个非法数值,后续所有读取操作都会失败,未被正确赋值的数组元素就会输出内存里的随机垃圾值 - 写入文件后没有关闭文件流:ofstream的写入内容默认存在内存缓冲区,没有手动关闭的话可能不会主动刷入磁盘,导致后续读取时文件为空
同时补充:你的代码缺少标准库命名空间声明,cout、cin、ofstream等接口都属于std命名空间,要么在头文件后加using namespace std;,要么给所有标准库接口前加std::前缀,否则代码会编译报错。
修复方法
修改写入文件的逻辑,每个数值后加空格分隔,写完后主动关闭文件流:
ofstream array ("Array_2D.txt", ios::out); for(int i=0; i<n; i++){ for (int j=0; j<m; j++) { array << b[i][j] << " "; // 新增空格作为数值分隔符 } } array.close(); // 关闭文件流,将缓冲区内容刷入磁盘
另外你用new申请的内存没有手动释放,会造成内存泄漏,可在代码末尾补充释放逻辑:
for (int i = 0; i < n; ++i) { delete[] b[i]; delete[] p[i]; } delete[] b; delete[] p;
2. 避免重复编写嵌套循环的方法
把重复的逻辑封装为通用函数即可,比如针对二维数组的初始化、打印、读写文件都可以单独封装,示例:
// 封装通用二维数组打印函数 void print2DArray(int** arr, int rows, int cols) { for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { cout << setw(5) << arr[i][j]; } cout << endl; } }
后续需要打印时直接调用print2DArray(b, n, m)、print2DArray(p, n, m)即可,不需要重复写循环逻辑。
如果使用C++11及以上版本,更推荐用std::vector<std::vector<int>>代替原生二级指针二维数组,不需要手动管理内存,封装函数的通用性也更强。
内容的提问来源于stack exchange,提问作者user14873340
相关产品推荐
相关产品推荐

