read的Linux C函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了read的Linux C函数相关的知识,希望对你有一定的参考价值。

参考技术A

read(由已打开的文件读取数据)
相关函数
readdir,write,fcntl,close,lseek,readlink,fread
表头文件
#include<unistd.h>
定义函数
ssize_t read(int fd,void * buf ,size_t count);
函数说明
read()会把参数fd 所指的文件传送count个字节到buf指针所指的内存中。若参数count为0,则read为实际读取到的字节数,如果返回0,表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。
附加说明
如果顺利read()会返回实际读到的字节数,最好能将返回值与参数count 作比较,若返回的字节数比要求读取的字节数少,则有可能读到了文件尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文件读写位置则无法预期。
错误代码
EINTR 此调用被信号所中断。
EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。
EBADF 参数fd 非有效的文件描述词,或该文件已关闭。

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;
	
	
 

以上是关于read的Linux C函数的主要内容,如果未能解决你的问题,请参考以下文章

arm6410,linux,c语言,read函数返回-1,错误:bad address

(二十)linux中i2c的ioctl,write,read函数的使用

FIFO read() 函数卡在 c 中

C语言用read封装/实现一个readline函数,读取文件一行 or 最后一行

C语言read函数

linux内核系统调用和标准C库函数的关系分析