如何使用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
相关产品推荐
相关产品推荐

