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

二维数组赋值异常:读取文件后隔行零值,求问题排查

问题分析:读取文件到一维模拟二维数组时出现隔行零值

问题场景

编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:45:46