如何根据输入文件的行数声明对应数量的数组?
逐行读取文件内容并创建独立数组(禁用字符串与多维数组)
需求说明
给定t.txt文件内容如下:
1 2 3 4 5 6 7 8 9 0
需要为文件中的每一行创建一个独立的数组存储该行的数字(如示例中的arr1和arr2),且禁止使用字符串和多维数组。
现有代码问题
你当前的代码仅完成了行数和字符数的统计,没有实现数字提取与数组创建的核心逻辑,且使用!input_file.eof()作为循环终止条件会导致最后一次读取重复。
解决方案
由于不能使用多维数组,我们可以用指针数组(int**)来管理多个独立的一维数组——每个指针指向对应行的数字数组。实现分为两步:
- 第一次遍历文件,统计总行数和每行的数字个数
- 根据统计结果分配内存,第二次遍历文件将数字存入对应数组
完整代码实现:
#include <iostream> #include <fstream> using namespace std; int main() { ifstream input_file("t.txt"); if (!input_file.is_open()) { cerr << "Failed to open file!" << endl; return 1; } // 第一步:统计总行数和每行的数字数量 int line_count = 0; int* nums_per_line = nullptr; int num; bool is_new_line = true; // 先遍历一次文件,统计数据 while (input_file >> num) { if (is_new_line) { line_count++; // 重新分配nums_per_line数组,记录每行的数字数 int* temp = new int[line_count]; if (nums_per_line != nullptr) { for (int i = 0; i < line_count - 1; i++) { temp[i] = nums_per_line[i]; } delete[] nums_per_line; } temp[line_count - 1] = 1; nums_per_line = temp; is_new_line = false; } else { nums_per_line[line_count - 1]++; } // 检查当前数字后是否是换行 char next_char; input_file.get(next_char); if (next_char == '\n') { is_new_line = true; } else { // 不是换行,把字符放回流中,供下次读取 input_file.putback(next_char); } } // 重置文件指针,准备第二次读取 input_file.clear(); input_file.seekg(0, ios::beg); // 第二步:分配数组并存储每行数字 int** line_arrays = new int*[line_count]; for (int i = 0; i < line_count; i++) { line_arrays[i] = new int[nums_per_line[i]]; } int current_line = 0; int current_idx = 0; while (input_file >> num) { line_arrays[current_line][current_idx++] = num; char next_char; input_file.get(next_char); if (next_char == '\n') { current_line++; current_idx = 0; } else { input_file.putback(next_char); } } // 测试输出:打印每个数组的内容 for (int i = 0; i < line_count; i++) { cout << "arr" << i+1 << "[" << nums_per_line[i] << "] = {"; for (int j = 0; j < nums_per_line[i]; j++) { if (j > 0) cout << ","; cout << line_arrays[i][j]; } cout << "};" << endl; } // 释放内存,避免泄漏 delete[] nums_per_line; for (int i = 0; i < line_count; i++) { delete[] line_arrays[i]; } delete[] line_arrays; input_file.close(); return 0; }
代码说明
- 第一次遍历文件时,通过
input_file >> num自动跳过空格和换行,同时检查每个数字后的字符判断是否换行,以此统计每行的数字数量 - 使用
int** line_arrays存储多个独立数组的指针,每个数组大小对应该行的数字数量,避免了多维数组的使用 - 最后记得手动释放动态分配的内存,防止内存泄漏
内容的提问来源于stack exchange,提问作者petat_irrumator
相关产品推荐
相关产品推荐

