C++实现矩阵从文件读取、修改后回写的方法咨询
核心问题排查
你现在读矩阵失败是多个逻辑错位叠加导致的,对应原代码的问题点:
- 写文件时没有给数值添加空格/换行列分隔:所有数字直接拼接成一整串无间隔字符,既不符合矩阵存储格式,下次读取时无法拆分独立数值
- 读写逻辑不匹配:空文件分支写入矩阵时,根本没有在文件开头存储矩阵的行列维度,但非空读取分支却一上来先读
m1和n1两个维度值,等于把矩阵的前两个数字错当成行列数,直接导致读取位置错位 - 读指针位置错误:用
ios::ate模式打开文件时,读指针会自动定位到文件末尾,但原代码没有把指针移回文件开头就直接读取内容,哪怕文件有有效数据也读不到任何值 - 冗余数组设计:同时定义了
arr和arr1两个完全重复的10×10数组,徒增出错可能
正确的实现逻辑
按照你要的功能,流程要对齐读写的格式:
- 用带
ios::ate模式打开array.txt,通过流指针位置判断文件是否为空 - 如果文件为空:初始化全0的10×10矩阵,按「每个数值间加空格、每写完一行加换行」的格式写入文件
- 如果文件非空:因为固定是10×10的矩阵,不需要额外读维度,直接把读指针移回文件开头,逐行逐列读取数值存入内存矩阵即可
- 对内存矩阵完成增量更新
- 用和之前一致的带分隔符的格式,把更新后的矩阵覆盖写回
array.txt
可直接运行的修正代码
#include <bits/stdc++.h> #include <cstring> using namespace std; class block{ public: // 矩阵增量更新+打印 void inc(int arr[][10]) { int k; cout << "by how much value do you want to increment the array's values" << endl; cin >> k; // 数值更新 for(int i=0 ; i<10; i++) { for(int j=0; j<10; j++) { arr[i][j] += k; } } // 打印更新后的矩阵 for(int i=0 ; i<10; i++) { for(int j=0; j<10; j++) { cout << arr[i][j] << " "; } cout << endl; } } void details() { const int ROW = 10, COL = 10; int mem_mat[ROW][COL]; // 内存中的矩阵,不需要额外传入外部数组 // 第一步:判断文件是否为空 ifstream fin("array.txt", ios::ate); if (!fin) { cerr << strerror(errno) << "\n"; return; } bool is_file_empty = (fin.tellg() == 0); if (is_file_empty) { // 文件为空:初始化全0矩阵 cout << "NULL" << endl; for(int i=0; i<ROW; i++) { for(int j=0; j<COL; j++) { mem_mat[i][j] = 0; } } fin.close(); } else { // 文件非空:直接按10×10的固定格式读取矩阵 fin.seekg(0); // 把读指针移回文件开头(因为之前用ate模式定位到文件末尾了) for(int i=0; i<ROW; i++) { for(int j=0; j<COL; j++) { fin >> mem_mat[i][j]; // >>操作符会自动跳过空格、换行等空白分隔符 } } fin.close(); } // 第二步:更新矩阵 inc(mem_mat); // 第三步:把更新后的矩阵写回文件,注意加分隔符 ofstream fout("array.txt", ios::trunc); for(int i=0; i<ROW; i++) { for(int j=0; j<COL; j++) { fout << mem_mat[i][j] << " "; } fout << "\n"; // 每写完一行加换行,保证格式清晰 } fout.close(); } }; int main() { block b1; b1.details(); return 0; }
测试注意事项
- 第一次运行时如果
array.txt是空文件,程序会自动写入格式正确的全0矩阵,打开文件能看到10行、每行10个带空格分隔的0值 - 第二次运行时程序会正常读取文件里的矩阵值,完成增量更新后再写回,不会再出现读取错位的问题
- 不要手动修改
array.txt的格式,确保数值之间是空格/换行分隔,否则会影响正常读取
内容的提问来源于stack exchange,提问作者bruno
相关产品推荐
相关产品推荐

