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

如何根据输入文件的行数声明对应数量的数组?

逐行读取文件内容并创建独立数组(禁用字符串与多维数组)

需求说明

给定t.txt文件内容如下:

1 2 3 4 5 6 7
8 9 0

需要为文件中的每一行创建一个独立的数组存储该行的数字(如示例中的arr1和arr2),且禁止使用字符串和多维数组。

现有代码问题

你当前的代码仅完成了行数和字符数的统计,没有实现数字提取与数组创建的核心逻辑,且使用!input_file.eof()作为循环终止条件会导致最后一次读取重复。

解决方案

由于不能使用多维数组,我们可以用指针数组(int**)来管理多个独立的一维数组——每个指针指向对应行的数字数组。实现分为两步:

  1. 第一次遍历文件,统计总行数和每行的数字个数
  2. 根据统计结果分配内存,第二次遍历文件将数字存入对应数组

完整代码实现:

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:35:17