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
相关产品推荐
相关产品推荐

