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

C++实现矩阵从文件读取、修改后回写的方法咨询

核心问题排查

你现在读矩阵失败是多个逻辑错位叠加导致的,对应原代码的问题点:

  • 写文件时没有给数值添加空格/换行列分隔:所有数字直接拼接成一整串无间隔字符,既不符合矩阵存储格式,下次读取时无法拆分独立数值
  • 读写逻辑不匹配:空文件分支写入矩阵时,根本没有在文件开头存储矩阵的行列维度,但非空读取分支却一上来先读m1和n1两个维度值,等于把矩阵的前两个数字错当成行列数,直接导致读取位置错位
  • 读指针位置错误:用ios::ate模式打开文件时,读指针会自动定位到文件末尾,但原代码没有把指针移回文件开头就直接读取内容,哪怕文件有有效数据也读不到任何值
  • 冗余数组设计:同时定义了arr和arr1两个完全重复的10×10数组,徒增出错可能
正确的实现逻辑

按照你要的功能,流程要对齐读写的格式:

  1. 用带ios::ate模式打开array.txt,通过流指针位置判断文件是否为空
  2. 如果文件为空:初始化全0的10×10矩阵,按「每个数值间加空格、每写完一行加换行」的格式写入文件
  3. 如果文件非空:因为固定是10×10的矩阵,不需要额外读维度,直接把读指针移回文件开头,逐行逐列读取数值存入内存矩阵即可
  4. 对内存矩阵完成增量更新
  5. 用和之前一致的带分隔符的格式,把更新后的矩阵覆盖写回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 15:15:03