二维数组赋值异常:读取文件后隔行零值,求问题排查
问题分析:读取文件到一维模拟二维数组时出现隔行零值
问题场景
编写C++代码读取包含n行、每行p个double数值的文件,存入一维数组模拟的二维数组cellArr,但打印时发现每隔一行全为零值。
文件内容
3.0 5.0 9.0 1.0 7.0 10.0 2.0 6.0 4.0 8.0 11.0 12.0 20.0 19.0 15.0 13.0 29.0 24.0 17.0 21.0
代码片段
fileInStream.open(input); cellArr = new double[rows * cols]; int i, j = 0; while (getline(fileInStream, line)){ stringstream ss(line); while (ss >> cell){ *(cellArr + i * cols + j) = stod(cell); j++; } i++; } for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << *(cellArr + i * cols + j) << " "; } cout << endl; }
输出结果
3 5 9 1 0 0 0 0 7 10 2 6 0 0 0 0 4 8 11 12
问题根源
变量j未在每一行读取开始时重置为0。
- 第一行读取时,
j从0递增到3,数值存入cellArr[0*4+0]到cellArr[0*4+3](索引0-3),此时j的值变为4。 - 第二行读取时,
j从4开始递增,数值被存入cellArr[1*4+4]到cellArr[1*4+7](索引8-11),但打印第二行时访问的是索引4-7,这些位置未被赋值,默认初始化为0。 - 后续行以此类推,导致奇数行(索引1、3)的对应位置始终未被正确赋值,呈现全零。
另外原代码中int i, j = 0;仅初始化了j,i未被初始化,属于未定义行为,会带来潜在风险。
修复方案
在每一行读取的循环内重置j为0,同时初始化i:
fileInStream.open(input); cellArr = new double[rows * cols]; int i = 0; // 显式初始化i while (getline(fileInStream, line)){ stringstream ss(line); int j = 0; // 每行开始时重置j为0 while (ss >> cell){ *(cellArr + i * cols + j) = stod(cell); j++; } i++; } // 打印部分保持不变 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << *(cellArr + i * cols + j) << " "; } cout << endl; }
内容的提问来源于stack exchange,提问作者Coder99
相关产品推荐
相关产品推荐

