文件IO:系统调用--->Linux内核提供的文件操作接口
一.函数接口
(1) 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_TRUNC:清空文件
O_APPEND:追加
int open(const char *pathname, int flags, mode_t mode);
mode:文件被创建时,需要增加的读写执行权限(0664,0表示8进制,与掩码002相或)
rwxrwxrwx
111 111 111
rwx:当前用户对该文件读写执行权限(Linux)
rwx:同组用户对该文件的读写执行权限
rwx:其他用户对该文件的读写执行权限
umask:掩码 002 000 000 010
mode:权限
(mode & ~umask)
110 110 100
&111 111 101
110 110 100
rw- rw- r--
返回值:
成功:文件描述符
失败:-1
文件描述符:操作系统为已打开文件分配的标识符,是一个小的,非负的整形数据
代表了一个已打开的文件
默认文件描述符范围:0-1023 分配原则:最小未被使用原则
系统默认已打开的三个文件对应的文件描述符:
标准io (FILE *) 文件io (fd-->int)
标准输入设备: stdin 0
标准输出设备: stdout 1
标准出错设备: stderr 2
文件描述符泄露:打开的文件使用完时,未及时关闭
1. 使用完及时关闭
2. 修改文件描述上限
"r" ---->O_RDONLY
"r+" ---->O_RDWR
"w" ---->O_WRONLY | O_CREAT |O_TRUNC, 0664
"w+"--->O_RDWR | O_CREAT | O_TRUNC, 0664
"a" ---->O_WRONLY | O_CREAT | O_APPEND, 0664
"a+" ---->O_RDWR | O_CREAT | O_APPEND, 0664
(2) int close(int fd);
功能:关闭fd文件描述符所代表的文件
返回值:成功:0 失败:-1
(3)ssize_t read(int fd, void *buf, size_t count);
功能:从文件中读取数据
参数:
fd:要读的文件
buf:存储读取到的数据的内存首地址
count:尝试(期待)读到的字节数
返回值:
成功:实际读到的字节数
失败:-1
文件末尾:0
(4)ssize_t write(int fd, const void *buf, size_t count);
功能:向文件中写入数据
参数:
fd : 要写入的文件
buf:要写入的数据的首地址
count:写入的字节数
返回值:
成功:实际写入的字节数
失败:-1
//文件的拷贝
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
if(argc < 3)
{
printf("Usage:./a.out <srcfile> <dstfile>\n");
return -1;
}
int fdsrc = open(argv[1],O_RDWR);
int fddst = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664);
if(-1 == fdsrc || -1 == fddst)
{
printf("fail open\n");
return -1;
}
while(1)
{
char buff[1024] = {0};
ssize_t size = read(fdsrc,buff,1024);
if(size <= 0)
{
break;
}
write(fddst,buff,size);
}
close(fdsrc);
close(fddst);
return 0;
}
文件偏移函数:
(5)off_t lseek(int fd, off_t offset, int whence);
功能:重新定位文件的读写位置
参数:
fd:定位的文件
offset:定位的偏移量
whence:要偏移的位置
返回值:
成功:当前读写位置到文件开头的偏移量
失败:-1
时间相关的函数:
time(); 功能:获取1970-1-1 0:0:0到现在的秒数
ctime();将秒数转换成字符串时间
localtime();将秒数转换成日历时间
printf类函数:
int printf(const char *format, ...);
将格式化的字符串打印到终端
int fprintf(FILE *stream, const char *format, ...);
将格式化后的字符串写入到文件流指针所对用的文件里
int dprintf(int fd, const char *format, ...);
将格式化后的字符串写入到文件描述符所对用的文件里
int sprintf(char *str, const char *format, ...);
将格式化后的字符串写入到str所指向的内存空间

641

被折叠的 条评论
为什么被折叠?



