函数功能:
打开文件,文件不存在时则创建一个文件。
函数参数:
pathname:被打开文件名,包括文件路径;
flags:打开文件的行为标识,如只读、只写、读写等;具体参数选择标识及含义如下。
注意:
1)前三个取值参数不可使用“|”,但可以与后面几个取值参数进行“|”操作,进行选择相应功能;
2)以读写方式打开只能用“O_RDWR”,不能用“O_REONLY|O_WRONLY”。
mode:此参数只有在打开的文件不存时才有效,即是指定创建文件时的用户权限。
函数返回值:
成功:打开文件描述符。
失败:-1。
2.2close函数
函数原型:
int close(int fd);
所需头文件:
#include<uniste.h>
函数功能:
关闭已打开的文件。
函数参数:
fd:文件描述符,open函数的返回值。
函数返回值:
成功:0。
失败:-1。
2.3read函数
函数原型:
ssize_t read(int fd, void *addr, size_t count);
所需头文件:
#include<unistd.h>
函数功能:
读取指定的数据到内存。
函数参数:
fd:文件描述符。
addr:内存首地址,存放读取返回数据。
count:读取的字节数。
函数返回值:
成功:实际读取字节数。
失败:-1。
2.4write函数
函数原型:
ssize_t write(int fd, const void *addr, size_t count);
所需头文件:
#include<unistd.h>
函数功能:
向文件写入指定的数据。
函数参数:
fd:文件描述符。
addr:数据缓冲区首地址。
count:待写数据字节数。
函数返回值:
成功:实际写入的字节数。
失败:-1。
2.5lseek函数
函数原型:
off_t lseek(int fd,off_t offset,int whence)
所需头文件:
#include<unistd.h>
#include<sys/types.h>
函数功能:
指定文件操作地址偏移量。
函数参数:
fd:文件描述符。
offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。
whence:当前位置基点,取值及含义如下。
函数返回值:
成功:当前文件位置。
失败:-1。
3.编程实例
3.1实例1
利用IO函数读写文件。
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char \*buf="Read and write test!";
char buf_r[strlen(buf)+1];
int fd,size,len;
len = strlen(buf);
buf_r[len] = '/0';
//首先调用open 函数,并指定相应的权限
if ((fd = open("io\_test0.txt", O_CREAT | O_TRUNC | O_RDWR,0666 ))<0)
{
perror("open:");
exit(1);
}
else
printf("open and create file:io\_test0.txt %d OK\n",fd);
//调用write 函数,将buf 中的内容写入到打开的文件中
if ((size = write( fd, buf, len)) < 0)
{
perror("write:");
exit(1);
}
else
printf("write:%s OK\n",buf);
// 调用lseek 函数将文件指针移动到文件开始8个字节,并读出余下内容
lseek(fd, 8, SEEK_SET );
if ((size = read( fd, buf_r, len-8))<0)
{
perror("read:");
exit(1);
}
else
printf("read form file:%s OK\n",buf_r);
if ( close(fd) < 0 )
{
perror("close:");
exit(1);
}
else
printf("close io\_test0.txt OK\n");
return 0;
}
Linux下运行结果:
3.2实例2
利用IO函数实现Linux命令终端的复制(cp)命令。使用 open() 打开源文件,使用 read() 从文件读数据,使用 write() 向目标文件写数据。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
if((argc == 3) && (strcmp(argv[1], argv[2]) != 0))
{// 保证有 3 个参数,而且源文件和目的文件名字不能一样
int fd_src, fd_dest, ret;
//只读方式打开源文件
fd_src = open(argv[1], O_RDONLY);
if(fd_src < 0)
{
perror("open argv[1]");
return -1;
}
// 新建目的文件
fd_dest = open(argv[2], O_WRONLY|O_CREAT, 0755);
if(fd_dest < 0)
{
close(fd_src);
perror("open argv[2]");
return -1;
}
do
{
char buf[1024] = {0};
// 从源文件读取数据
ret = read(fd_src, buf, sizeof(buf));
// 把数据写到目的文件,注意最后一个参数,有多少写多少
write(fd_dest, buf, ret);
}while(ret > 0);
// 关闭已打开的文件