C语言用read封装/实现一个readline函数,读取文件一行 or 最后一行
Posted 狱典司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言用read封装/实现一个readline函数,读取文件一行 or 最后一行相关的知识,希望对你有一定的参考价值。
注意,readline函数可以在windows和linux下通用,但是linux和windows下的空行表示有所区别,下面封装的read_last_line只适用于Linux操作系统。
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <fcntl.h>
/* 读取fd的一行内容 */
ssize_t readline(int fd, char *buf, ssize_t maxlen)
ssize_t count = 0;
memset(buf, '\\0', sizeof(buf));
char *ptr = buf;
char tmp = 0;
while(1)
read(fd, &tmp, sizeof(char));
if(tmp == '\\n' || tmp == '\\0') break;
(*ptr) = tmp;
ptr ++;
count ++;
if(count >= maxlen)
printf("Out of buffer!\\n");
return -1;
return count;
/* 读取实际有内容的最后一行 */
ssize_t read_last_line(int fd, char *buf, ssize_t maxlen)
if(fd < 0) return -1;
if( lseek(fd, 0, SEEK_END) == 0 )
printf("空文件\\n");
return -1;
lseek(fd, -1, SEEK_CUR);
char tmp = '\\0';
while(lseek(fd, -1, SEEK_CUR) > 0)
read(fd, &tmp, sizeof(char));
if(tmp == '\\n') break;
else lseek(fd, -1, SEEK_CUR);
ssize_t offset;
while((offset = readline(fd, buf, maxlen)) != -1)
if(offset > 0) return offset;
else if( offset == 0 )
lseek(fd, -2, SEEK_CUR);
tmp = '\\0';
while(lseek(fd, -1, SEEK_CUR) > 0)
read(fd, &tmp, sizeof(char));
if(tmp == '\\n') break;
else lseek(fd, -1, SEEK_CUR);
continue;
return -1;
int main()
int fd = -1;
fd = open("t.txt", O_RDONLY);
if( fd == -1 )
printf("failed~!\\n");
char readbuf[1024] = 0;
read_last_line(fd, readbuf, sizeof(readbuf));
printf("最后一行:%s\\n",readbuf);
close(fd);
return 0;
以上是关于C语言用read封装/实现一个readline函数,读取文件一行 or 最后一行的主要内容,如果未能解决你的问题,请参考以下文章
read(),readline(),readlines()区别与用法
arm6410,linux,c语言,read函数返回-1,错误:bad address