文本文件数据写入二维数组后全为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; }
关键修改说明
- 跳过无效行:用两次
getline读取并忽略前两行的"25",避免干扰数据读取。 - 逐行对应数组行:用
row变量记录当前处理的数组行号,每读一行仅处理对应行的元素,不再覆盖整个数组。 - 单个字符解析:通过
line[col] - '0'直接将字符形式的数字转为整数,比atoi更适合单个字符的场景,效率更高。 - 边界保护:添加
row < 25和col < line.size()的判断,避免数组越界。 - 更可靠的文件判断:用
plik.is_open()替代plik.good(),判断文件打开状态更准确。
内容的提问来源于stack exchange,提问作者Kriszox 2
相关产品推荐
相关产品推荐

