1.Linux文件操作
“一切皆文件”是Linux系统的基本思想。Linux 提供的虚拟文件系统为多种文件系统和外设驱动提供了统一的接口,基于此类接口,可以实现文件的新建、打开(open)、读(read)、写(write)、关闭(close),及对随机文件的定位(lseek)。
通常,一个进程打开现有文件或新建文件时,系统会返回一个文件描述符fd(file descriptor),指示特定的文件,后面的读写、关闭文件都通过此文件描述符进行操作。无错误状态下的文件描述符是非负数,打开文件前应检查该标识是否为非负数。
一个进程运行时,都有一张自身的文件描述符,即是打开三个文件:标准输入、标准输出和标准出错处理。程序运行起来后,这三个文件是默认打开的。对应的宏描述为如下。
#define STDIN_FILENO 0 //标准输入的文件描述符
#define STDOUT_FILENO 1 //标准输出的文件描述符
#define STDERR_FILENO 2 //标准错误的文件描述符
2.常用IO函数
2.1 open函数
函数原型:
int open(const char *pathname, int flags, mode_t mode);
所需头文件:
#include
#include
#include
函数功能:
打开文件,文件不存在时则创建一个文件。
函数参数:
pathname:被打开文件名,包括文件路径;
flags:打开文件的行为标识,如只读、只写、读写等;具体参数选择标识及含义如下。
注意:
1)前三个取值参数不可使用“|”,但可以与后面几个取值参数进行“|”操作,进行选择相应功能;
2)以读写方式打开只能用“O_RDWR”,不能用“O_REONLY|O_WRONLY”。
mode:此参数只有在打开的文件不存时才有效,即是指定创建文件时的用户权限。
函数返回值:
成功:打开文件描述符。
失败:-1。
2.2close函数
函数原型:
int close(int fd);
所需头文件:
#include
函数功能:
关闭已打开的文件。
函数参数:
fd:文件描述符,open函数的返回值。
函数返回值:
成功:0。
失败:-1。
2.3read函数
函数原型:
ssize_t read(int fd, void *addr, size_t count);
所需头文件:
#include
函数功能:
读取指定的数据到内存。
函数参数:
fd:文件描述符。
addr:内存首地址,存放读取返回数据。
count:读取的字节数。
函数返回值:
成功:实际读取字节数。
失败:-1。
2.4write函数
函数原型:
ssize_t write(int fd, const void *addr, size_t count);
所需头文件:
#include
函数功能:
向文件写入指定的数据。
函数参数:
fd:文件描述符。
addr:数据缓冲区首地址。
count:待写数据字节数。
函数返回值:
成功:实际写入的字节数。
失败:-1。
2.5lseek函数
函数原型:
off_t lseek(int fd,off_t offset,int whence)
所需头文件:
#include
#include
函数功能:
指定文件操作地址偏移量。
函数参数:
fd:文件描述符。
offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。
whence:当前位置基点,取值及含义如下。
函数返回值:
成功:当前文件位置。
失败:-1。
3.编程实例
3.1实例1
利用IO函数读写文件。
#include
#include
#include
#include
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;
}
3.2实例2
利用IO函数实现Linux命令终端的复制(cp)命令。使用 open() 打开源文件,使用 read() 从文件读数据,使用 write() 向目标文件写数据。
#include
#include
#include
#include
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);
// 关闭已打开的文件
close(fd_src);
close(fd_dest);
}
return 0;
}
4.参考
[1] http://blog.csdn.net/tennysonsky/article/details/45868273
[2] http://blog.csdn.net/itcastcpp/article/details/38082035