如何逐行读取含任意长度行的文件?现有代码求助
解决逐行读取任意长度行的问题
你的代码核心问题在于:每次调用readLine都会重新打开文件并通过fseek定位到开头,所以永远只能读取第一行。要实现逐行推进,必须让文件指针在多次读取间保持当前位置,不要每次重新打开文件。
修改方案
核心调整思路
- 不在
readLine内打开文件,而是将已打开的FILE*作为参数传入,这样读取位置会在多次调用间持续保留。 - 优化动态扩容逻辑:原代码每次扩容后从头重读,效率极低,改为逐字符读取并追加内容,直到遇到换行或文件结尾。
修改后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> char* readLine(FILE* file) { if (file == NULL || feof(file)) return NULL; size_t size = 32; // 初始缓冲区大小,可根据需求调整 char* line = malloc(size * sizeof(char)); if (line == NULL) return NULL; size_t pos = 0; int c; // 逐字符读取,直到换行或文件结束 while ((c = fgetc(file)) != EOF && c != '\n') { // 缓冲区满时翻倍扩容 if (pos + 1 >= size) { size *= 2; char* temp = realloc(line, size * sizeof(char)); if (temp == NULL) { free(line); return NULL; } line = temp; } line[pos++] = (char)c; } // 保留换行符(如果不是文件结尾) if (c == '\n') { if (pos + 1 >= size) { size += 1; char* temp = realloc(line, size * sizeof(char)); if (temp == NULL) { free(line); return NULL; } line = temp; } line[pos++] = '\n'; } // 添加字符串结束符 if (pos + 1 >= size) { size += 1; char* temp = realloc(line, size * sizeof(char)); if (temp == NULL) { free(line); return NULL; } line = temp; } line[pos] = '\0'; return line; } int main() { FILE* file = fopen("config_01.dot", "r"); if (file == NULL) { perror("无法打开文件"); return EXIT_FAILURE; } char* line; int lineNum = 1; while ((line = readLine(file)) != NULL) { printf("第%d行 = %s", lineNum++, line); free(line); // 必须释放内存,避免泄漏 } fclose(file); return EXIT_SUCCESS; }
代码说明
- 文件指针复用:
readLine接收已打开的文件指针,每次调用从上次读取的断点继续,自然实现逐行推进。 - 高效扩容:采用缓冲区翻倍扩容的方式,比固定增量更高效;逐字符读取避免了从头重读的冗余操作。
- 内存安全:扩容失败时及时释放已分配内存,读取完成后主动释放每行的缓冲区,杜绝内存泄漏。
- 边界处理:兼容空行、文件结尾无换行符等场景,确保每行都以
\0结尾,符合C字符串规范。
用你提供的测试文本运行代码,会逐行输出所有内容,长短行都能正确读取,不会重复读取第一行。
内容的提问来源于stack exchange,提问作者3nondatur
相关产品推荐
相关产品推荐

