UNIX网络编程(套接字编程)
readline函数的编写
/*
* 日期:2021-8-9
* 作者:2304768518@qq.com
*
* readline函数,读取文件中一行的内容
*
*/
#include "unp.h"
static ssize_t myread(int fd,char *ptr);
//返回该函数读取到的字节数
//这个函数每次读取一个字节的数据就调用一次read函数,这是非常低效率的
ssize_t readline1(int fd,void *vptr,size_t maxlen)
{
ssize_t n,rc;
char c,*ptr=vptr;
for(n=1;n<maxlen;n++){
//if((rc=read(fd,&c,1))==1){//代表只读取了一个字符
if((rc=myread(fd,&c))==1){
*ptr++=c;
if(c=='\n'){
break;
}
}else if(rc==0){//代表读取到了文件末尾,
*ptr=0;
return(n-1);//读取到的字节数为n-1
}else{
if(errno==EINTR){//读取出错,再次读取
n=n-1;
}else{
return (-1);
}
}
}
ptr=NULL;
return (n);
}
//另一种方法实现readline
//static声明一个静态的全局变量
//read_cnt表示缓冲区剩余的没有被读取的字符数目
static int read_cnt;
static char *read_ptr;//指针指向读数据的位置
static char read_buf[MAXLINE];//缓冲区中存储所读取到的字符
static ssize_t myread(int fd,char *ptr)
{
if(read_cnt<=0){
again:
if((read_cnt=read(fd,read_buf,sizeof(read_buf)))<=0){
if(errno==EINTR){
goto again;
}
return -1;
}else if(read_cnt==0){
return 0;
}
read_ptr=read_buf;
}
read_cnt--;//剩余数量减少
*ptr=*read_ptr++;//赋值后指针移动
return 1;
}
//展露内部缓冲区的状态,便于调用者查看在当前文本行之后是否收到了新数据
ssize_t readlinebuf (void **vptrptr)
{
if(read_cnt){
*vptrptr=read_ptr;
}
return (read_cnt);
}
int main(int argc,char **argv)
{
//打开文件
int fd=open("file2",O_RDWR|O_CREAT);
//往文件中写东西
if(write(fd,"hello world\n hi lisa\n ",20)<0){
printf("write error\n");
}
//将文件的读写指针移到最前面
if(lseek(fd,0,SEEK_SET)<0){
printf("SEEK_ERROR\n");
}
ssize_t re;
char buff[14]="";
if(re=readline1(fd,buff,100)==-1){
printf("readline error\n");
}else{
printf("读出的一行为:%s",buff);
printf("缓冲区的下一个字符是:%s\n",read_ptr);
}
}