C++读取TXT文件数据存入二维数组异常问题排查
二维数组读取TXT数据未完全存储的问题分析与解决
你遇到的问题核心是数组越界导致的未定义行为,咱们一步步拆解:
问题根源
先看你原代码的逻辑:当j走到319(一行的最后一列)时,重置j=0并让i++。但这里忽略了一个关键限制:你的数组只有200行(索引范围是0~199)。当i已经到199(最后一行),处理完最后一列后,i会被递增到200,此时再执行file >> data[i][j]就会访问数组之外的内存——这属于C++中的未定义行为,轻则导致后续读取混乱,重则直接程序崩溃,自然无法完成所有数据的存储。
另外还有一个潜在风险:如果你的文本文件中数据数量不足64000个(200×320),原代码也会因为越界问题提前终止读取,但你提到前几行正确,所以主要问题还是越界。
修复后的代码
我们只需要在循环条件里加上i < 200的限制,确保不会访问超出数组范围的元素:
#include <fstream> #include <iostream> using namespace std; int main() { int data[200][320]; int i = 0; int j = 0; ifstream file; file.open("./../../../Data_PR2/data.txt", ios::in); // 先检查文件是否成功打开 if (!file.is_open()) { cerr << "Error: Failed to open the data file!" << endl; return 1; // 或者根据你的程序逻辑做错误处理 } while (i < 200 && file >> data[i][j]) { if (j == 319) { j = 0; i++; } else { j++; } } // 可选:检查是否读取了全部数据 if (i < 200 || j != 0) { cout << "Warning: Incomplete data read. Got " << i*320 + j << " elements out of expected 64000." << endl; } file.close(); return 0; }
额外说明
- 添加文件打开检查是个好习惯,避免因为文件路径错误、权限问题等导致后续读取无意义的错误;
- 循环结束后的检查可以帮你快速定位数据不足的问题,比如文件里的数字数量不够时会给出提示;
- 如果你用的是C++11及以上标准,也可以考虑用
vector<vector<int>>代替固定大小的数组,这样更加灵活,也能避免手动管理索引的麻烦。
内容的提问来源于stack exchange,提问作者Karol
相关产品推荐
相关产品推荐

