C语言读取文件行存入array无输出,如何加入dynamically allocating逻辑
核心问题分析
你当前的代码没有输出的核心原因有2个:
- 统计行数的循环执行完成后,文件指针已经移动到了文件末尾,后续读取文件内容的操作直接失败触发
exit(1),程序提前终止 - 固定大小的二维数组灵活性差,超出大小边界就会触发内存溢出,需要替换为动态分配逻辑
修复后的完整实现
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char buffer[1000] = {'\0'}; int column, row, columns = 0, rows = 0; char **maze = NULL; // 动态分配的二维数组指针 FILE* file = fopen("boards/0.txt", "r"); if (file == NULL) { printf("There's no such file.\n"); exit(1); } // 第一步:统计行数和列数 while(fgets(buffer, sizeof(buffer), file) != NULL) { rows += 1; // 取最长行的长度作为列数(如果所有行长度一致取第一行也可以) int curr_len = strlen(buffer); if (buffer[curr_len - 1] == '\n') curr_len--; // 去掉换行符 if (curr_len > columns) columns = curr_len; } // 第二步:重置文件指针到开头,准备读取内容 rewind(file); // 第三步:动态分配二维数组内存 maze = (char**)malloc(rows * sizeof(char*)); for (row = 0; row < rows; row++) { maze[row] = (char*)malloc((columns + 1) * sizeof(char)); // 多留1位存结束符 } // 第四步:读取文件内容到动态数组 for (row = 0; row < rows; row++) { fgets(maze[row], columns + 2, file); // 去掉末尾的换行符 int len = strlen(maze[row]); if (maze[row][len - 1] == '\n') { maze[row][len - 1] = '\0'; } } fclose(file); // 输出内容 for (row = 0; row < rows; row++) { printf("%s\n", maze[row]); } // 释放动态分配的内存 for (row = 0; row < rows; row++) { free(maze[row]); } free(maze); return 0; }
关键修改说明
- 新增
rewind(file)调用,将文件指针重置到开头,确保后续可以正常读取文件内容 - 用二级指针
char **maze替代固定大小的二维数组,先按行数分配一级指针空间,再逐行分配每一行的存储空间 - 用
fgets直接读取整行内容,替代逐个字符fscanf的写法,代码更简洁也降低出错概率 - 新增内存释放逻辑,避免运行时内存泄漏
内容的提问来源于stack exchange,提问作者zangstrell
相关产品推荐
相关产品推荐

