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

文本文件数据写入二维数组后全为0,求排查解决方法

问题分析与解决方案

核心问题

你的代码存在三个关键错误,导致数组全为0:

  • 整行覆盖整个数组:每次读取一行后,遍历二维数组的所有元素并赋值为当前行的整数值,最终整个数组会被最后一行的数值覆盖。如果最后一行是0,数组自然全为0。
  • 未跳过无效行:文件前两行的"25"是数组尺寸标识,却被当作数据行处理,会提前覆盖数组内容。
  • 错误解析单行数据:若每行是25个0/1字符(如0101...),atoi(line.c_str())只会提取行首的第一个数字(比如开头的0),而非逐个解析每个位置的数值。

修正后的代码

#include <fstream>
#include <string>
#include <iostream>
using namespace std;

int map[25][25]; // 定义25x25的二维数组

int main() {
    string line;
    fstream plik;
    plik.open("Maps/default.txt", ios::in);

    if (plik.is_open()) {
        // 跳过前两行的尺寸标识"25"
        string dummy;
        getline(plik, dummy);
        getline(plik, dummy);

        int row = 0;
        // 逐行读取数据,控制不超过数组行数
        while (getline(plik, line) && row < 25) {
            // 逐个解析行内的字符,赋值给对应列
            for (int col = 0; col < 25 && col < line.size(); col++) {
                // 将字符转成整数:'0'的ASCII码减'0'得0,'1'减'0'得1
                map[row][col] = line[col] - '0';
            }
            row++;
        }
        plik.close(); // 关闭文件
    }

    // 测试输出数组内容
    for (int x = 0; x < 25; x++) {
        for (int y = 0; y < 25; y++) {
            cout << map[x][y] << " ";
        }
        cout << endl;
    }
    return 0;
}

关键修改说明

  1. 跳过无效行:用两次getline读取并忽略前两行的"25",避免干扰数据读取。
  2. 逐行对应数组行:用row变量记录当前处理的数组行号,每读一行仅处理对应行的元素,不再覆盖整个数组。
  3. 单个字符解析:通过line[col] - '0'直接将字符形式的数字转为整数,比atoi更适合单个字符的场景,效率更高。
  4. 边界保护:添加row < 25和col < line.size()的判断,避免数组越界。
  5. 更可靠的文件判断:用plik.is_open()替代plik.good(),判断文件打开状态更准确。

内容的提问来源于stack exchange,提问作者Kriszox 2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:52:16