open ( ) :打开文件
头文件:fcntl.h
函数原型:int open (const char *pathname,int flags);
int open (const char *pathname,int flags,mode_t mode);
参数说明:pathname:常量字符串,指明文件的具体路径;
flags:文件打开的方式 常见的有
O_RDONLY: 以只读方式打开文件
O_WRONLY: 以只写方式打开文件
O_RDWR: 以读写方式打开文件
O_CREAT: 如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限
O_EXCL: 如果使用O_CREAT时文件存在,则返回错误消息。这一参数可测试文件是否存在。此时open是原子操作,防止多个进程同时创建同一个文件
O_NOCTTY: 使用本参数时,若文件为终端,那么该终端不会成为调用open()的那个进程的控制终端
O_TRUNC: 若文件已经存在,那么会删除文件中的全部原有数据,并且设置文件大小为0
O_APPEND: 以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾
O_NONBLOCK: 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。
O_SYNC: 使每次write都等到物理I/O操作完成。
O_RSYNC: read 等待所有写入同一区域的写操作完成后再进行
mode:被创建的文件权限,例如 0777 ,一般在搭配O_CREAT 参数时使用。
返回值:成功打开 返回一个非负整数;
失败 返回 -1
例子:
open ("C:/Desktop/test.c, O_RDWR | O_CREAT, 0777);
read( ) :从文件中读取数据;
头文件:unistd.h
函数原型:ssize_t read (int fd, void *buf, size_t count);
参数说明:fd:open 返回的文件描述符;
buf:指缓冲区,即读取的数据会被放到这个缓冲区中去;
count:指定一次read多少个字符;
返回值:返回所读取的字节数 ;
0(读到EOF);
-1(出错)
例子:
read (fs, buf, sizeof(buf)
write( ):向文件写数据;
头文件:unistd.h
函数原型:ssize_t write( int fd, const void *buf, size_t count);
参数说明:fd:open 返回的文件描述符;
buf:数据会从buf 缓冲区写到 fd 指定的文件中;
count:每次写多少个字节;
返回值:成功:返回写入文件的字节数,
失败:-1;
例子:
write(fd, buf, strlen(buf));
lseek( ):用于在指定的文件描述符中将将文件指针定位到相应位置。
头文件:unistd.h sys/types.h
函数原型:off_t lseek(int fd, off_t offset,int whence);
参数说明:fd:open 返回的文件描述符;
offset :偏移量,每一读写操作所需要移动的距离,单位是字节,可正可负。
whence:当前的位置基点;
SEEK_SET:当前位置为文件开头;
SEEK_CUR:当前位置为文件指针的位置;
SEEK_END:当前位置为文件的末尾;
返回值:成功,返回当前文件指针位置距文件开头的位移,即多少个字节,常常利用将文件指针置于文件末尾来计算文件大小;
失败:-1;
例子:
lseek (fd, 0, SEEK_END);
close():用于关闭一个被打开的的文件
头文件:unistd.h
函数原型:int close (int fd);
参数说明: fd :文件描述符;
返回值:成功:0 ;
失败:-1;
例子:
close(fd);
综合例子:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main() {
char *path1 = "C:/Desktop/main.c";
char *path2 = "C:/Desktop/2.txt";
char buf[1024] = {0};
int count = 0 ;
int pos;
//open()打开要读取的源文件;
int fs = open(path1, O_RDONLY);
if ( fs < 0){
perror ("打开文件 path1 失败");
return -1;
}
pos = lseek(fs, 0, SEEK_CUR);
printf("打开path1 时文件指针位置为:%d\n",pos);
//打开要写入的目的文件;
int fd = open (path2, O_WRONLY|O_CREAT);
if ( fd < 0){
perror ("打开文件 path2 失败");
return -1;
}
// 复制打开的的源文件内容到新的文档中;
while (count = read (fs, buf, sizeof(buf)) > 0){
write(fd, buf, strlen(buf));
pos = lseek(fs, 0, SEEK_CUR);
pos += count;
lseek(fs, pos, SEEK_SET);
printf("read后文件指针位置为:%d\n",pos);
}
close(fs);
close(fd);
return 0;
}