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

C++如何读取整数ASCII文件并自动识别行列存入二维整数数组

问题修正方案

原代码核心问题

  • 非法使用变长数组:C++标准不支持使用运行时可变的numrows/numcols作为静态数组的长度,静态数组长度必须是编译期常量,这里可以用vector嵌套实现动态二维数组。
  • 数组定义时机错误:在还未读取到行数、列数的前提下就定义数组,此时numrows和numcols均为0,即使编译器支持扩展语法的变长数组,也无法正常存储数据。
  • 重复读取逻辑错误:将文件全部内容读入stringstream后,原文件的读指针已经到达末尾,后续循环中同时从stringstream和原文件重复读取同一位置的数据,无法正确获取数组元素。
  • 输出没有分隔符,最终打印的数字会连在一起无法区分。

修正后可运行代码

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector> // 新增头文件用于动态数组

using namespace std;

int main() {
    int row = 0, col = 0, numrows = 0, numcols = 0;
    ifstream askeeFile("asciiFile.dat");
    // 先判断文件是否正常打开
    if (!askeeFile.is_open()) {
        cerr << "文件打开失败,请检查路径是否正确" << endl;
        return 1;
    }
    stringstream sd;
    sd << askeeFile.rdbuf();
    askeeFile.close(); // 内容已经全部读入stringstream,可直接关闭原文件

    // 先读取列数、行数
    sd >> numcols >> numrows;
    // 用vector实现动态二维数组
    vector<vector<int>> array(numrows, vector<int>(numcols));

    // 填充数组并打印
    for(row = 0; row < numrows; ++row) {
        for (col = 0; col < numcols; ++col) {
            sd >> array[row][col];
            cout << array[row][col] << "\t"; // 用制表符分隔每个元素
        }
        cout << endl; // 每行结束换行
    }

    return 0;
}

使用说明

保证asciiFile.dat的第一行前两个整数依次是列数、行数,之后紧跟对应数量的整数元素,即可正常读取。

内容的提问来源于stack exchange,提问作者Syn Joseph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:00:02