这一节主要是将系统IO的四个函数:read write
(1)read
头文件:#include <unistd.h>
ssize_t read(int fd, void * buf, size_t count);
说明:read是把参数fd所指的文件传送count个字节到buf指针所指的内存中去。若参数count为0,则read()不会有作用并返回0。返回值为实际读取的字节数,若返回0.表示已经读取完成,此外文件读写位置会随读取到的字节移动。
(2)write
头文件:#include <unistd.h>
ssize_t
write (int fd, const void * buf, size_t count);
说明:write()函数会把参数buf所指的内存写入count个字节到参数fd所指的文件内。
程序:
int fd_src = open(argv[1], O_RDONLY);
int fd_dst = open(argv[2], O_RDONLY|O_CREAT|O_TRUNC,0644);
char buf[100];
int nread,nwrite;
while(1)
{
bzero(buf, 100);
nread = read(fd_src, buf, 100);
if(nread == -1)
{
perror("read() failed");
exit(1);
}
if(nread == 0)
break;
char *p = buf;
while(nread > 0)
{
nwrite = write(fd_dst, p, nread);
nread -= nwrite;
p += nwrite; //意思是因为write函数不会自动转移位置去写入。
}
}
(3)lseek
头文件:#include <sys/types.h> #include <unistd.h>
定义函数:off_t lseek(int fildes, off_t offset, int whence);
说明:每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。read()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置,参数fildes为已打开的文件描述符,参数offset为根据参数whence来移动读写位置的位移数。
参数whence为下列其中一种:
1) 欲将读写位置移到文件开头时:lseek(int fildes, 0, SEEK_SET);
2) 欲将读写位置移到文件尾时:lseek(int fildes, 0, SEEK_END);
3) 想要取得目前文件位置时:lseek(int fildes, 0, SEEK_CUR);