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

如何使用realloc()函数逐项读取文本文件中的整数数组?

用realloc()逐个添加元素到动态数组的解决方案

我来帮你理清怎么用realloc()逐个添加元素到动态数组,同时解决你代码里的困惑。首先看你的核心需求:无视文本文件的行列结构,把所有整数元素逐项读到动态数组中——这个需求用一维动态数组就能轻松实现,你现在的代码看起来是在尝试构建二维数组(用了int**),反而把问题复杂化了。

核心思路:一维动态数组存储所有元素

因为不需要保留原文件的行列结构,只需要按顺序存储所有整数,一维数组是最直接的选择。用realloc()逐个扩展数组空间的步骤如下:

1. 初始化动态数组

先定义一个空的动态数组指针,以及记录当前元素数量的变量:

int *dynamic_array = NULL;
size_t current_count = 0; // 当前数组里的元素个数

2. 逐行读取文件并解析数字

用fgets()读取每行内容,再用strtok()分割出每个数字(分隔符要包含空格、制表符、换行符,确保能正确拆分所有整数)。

3. 逐个添加元素并扩展空间

对每个解析出的整数,我们需要:

  • 用realloc()申请新的空间(当前元素数+1个int的大小)
  • 检查内存分配是否成功(避免realloc()失败导致原指针丢失)
  • 将新元素放到数组的末尾
  • 更新元素计数

完整可运行示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    FILE *file = fopen("your_file.txt", "r");
    if (!file) {
        perror("Failed to open file");
        return 1;
    }

    int *dynamic_array = NULL;
    size_t current_count = 0;
    char temp_line[256]; // 可根据文件每行的最大长度调整

    while (fgets(temp_line, sizeof(temp_line), file) != NULL) {
        // 分割每行的数字,支持空格、制表符、换行符作为分隔
        char *token = strtok(temp_line, " \t\n");
        while (token != NULL) {
            // 将字符串转换为整数
            int num = atoi(token);
            
            // 先申请新空间,用临时指针接收,避免原指针丢失
            int *temp_ptr = realloc(dynamic_array, sizeof(int) * (current_count + 1));
            if (!temp_ptr) {
                perror("Memory reallocation failed");
                // 释放已分配的内存,避免泄漏
                free(dynamic_array);
                fclose(file);
                return 1;
            }
            dynamic_array = temp_ptr;
            
            // 添加新元素到数组末尾
            dynamic_array[current_count] = num;
            current_count++;

            // 取下一个数字token
            token = strtok(NULL, " \t\n");
        }
    }

    fclose(file);

    // 测试输出所有读取到的元素
    printf("All elements read:\n");
    for (size_t i = 0; i < current_count; i++) {
        printf("%d ", dynamic_array[i]);
    }
    printf("\n");

    // 最后一定要释放动态分配的内存
    free(dynamic_array);
    return 0;
}

对你原有代码的困惑解析

你原来的代码里用了int **MatrizTemp,这是二维数组的指针(指向指针的指针),如果你的需求是保留原文件的行列结构,那这个方向是对的,但需要调整细节:

  • 扩展行的时候,应该用sizeof(int*)而不是sizeof(int),因为MatrizTemp是指针数组:MatrizTemp = realloc(MatrizTemp, sizeof(int*) * (i + 1));
  • 对每一行扩展列的时候,再用realloc()分配该行的空间:MatrizTemp[i] = realloc(MatrizTemp[i], sizeof(int) * (j + 1));

但既然你的需求是无视行列,那二维数组完全没必要,用上面的一维数组方案更简单高效。

关键注意事项

  • 不要直接覆盖原指针:永远不要写dynamic_array = realloc(dynamic_array, ...);,如果realloc()失败返回NULL,会导致原来的内存地址丢失,造成内存泄漏。一定要用临时指针接收返回值,检查成功后再赋值。
  • 处理内存分配失败:必须检查realloc()的返回值,避免程序崩溃或内存泄漏。
  • 文件操作的错误处理:打开文件后一定要检查是否成功,不能直接操作NULL文件指针。
  • 释放内存:动态分配的内存必须在使用完后用free()释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Adalberto J. Brasaca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:05:52