C语言getline()读取文件最后一行重复两次问题如何解决?
C语言getline读取文件最后一行重复问题解决
问题原因
- 执行逻辑顺序错误:你在循环体中先执行
getline读取新行再执行打印,当getline读到文件末尾时会返回-1,但此时存储行内容的line缓冲区不会被修改,仍然保留最后一次成功读取的内容,代码没有校验本次读取是否成功就直接打印,就会触发最后一行重复输出的问题。同时循环外的首次getline读取的第一行内容会被循环内的首次getline覆盖,导致首行内容丢失。 - 校验时机不匹配:你当前的while循环条件校验的是上一次
getline的返回结果,和本次循环要处理的内容不对应,无法拦截到读取失败的情况。
修复方案
调整读取、校验、处理的顺序,将getline读取和返回值校验直接放在while循环条件中,保证只有读取成功时才进入循环体处理内容,同时补充内存释放逻辑避免泄漏,修改后代码如下:
char *line = NULL; size_t line_buf_size = 0; ssize_t line_size; int row = 0; // 读取后立刻校验,仅读取成功才进入循环处理 while ((line_size = getline(&line, &line_buf_size, stdin)) >= 0) { row++; printf("%s", line); } // 释放getline动态分配的缓冲区 free(line); line = NULL;
内容的提问来源于stack exchange,提问作者randomNameGenerator
相关产品推荐
相关产品推荐

