一.Linux文件描述符及文件编程的一般步骤
1.文件描述符
2.文件编程的一般步骤
二.Linux文件编程API
1.文件打开
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
需包含的头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
参数解释:
const char *pathname:要打开文件的路径
int flags:打开方式
mode_t mode:待创建文件的文件权限
返回值解释:
若打开成功则返回一个大于等于3的文件描述符,若打开失败返回-1
打开方式介绍:
O_RDONLY:以只读方式打开
O_WRONLY:以只写方式打开
O_RDWR:以可读可写方式打开
mode介绍:
宏 | 数字 | 介绍 |
S_IRUSR | 4 | 可读权限 |
S_IWUSR | 2 | 可写权限 |
S_IXUSR | 1 | 可执行权限 |
S_IRWXU | 7 | 可读,写,执行权限 |
补充:
在参数二int flags后指定以下宏可达到的效果:
O_CREAT:若文件未打开则创建文件
O_EXCL:若同时指定O_CREAT,而文件已存在,则函数返回-1
O_APPEND:写文件时在文件末尾追加内容
O_TRUNC:若文件有内容则打开时清空内容
使用示例:
fd = open("./file",O_RDWR|O_CREAT,0600);
2.写入文件
函数原型:
ssize_t write(int fd, const void *buf, size_t count);
需包含的头文件:
#include <unistd.h>
参数解释:
int fd:文件描述符
const void *buf:缓冲区
size_t count:写入的大小
返回值解释:
若写入成功返回写入的字节数,失败则返回-1
特别注意;
在写入文件操作完成后,文件光标位置会在文件末尾处,若需读取,需先将光标位置移动到开头处
3.读取文件
函数原型:
ssize_t read(int fd, void *buf, size_t count);
需包含的头文件:
#include <unistd.h>
参数解释:
int fd:文件描述符
const void *buf:缓冲区
size_t count:读取的大小
返回值解释:
若写入成功返回读取的字节数,失败则返回-1
4.创建文件
函数原型:
int creat(const char *pathname, mode_t mode);
需包含的头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
参数解释:
const char *pathname:文件路径(创建到哪)
mode_t mode:文件权限
返回值解释:
若创建成功则返回一个大于等于3的文件描述符,若打开失败返回-1
5.移动光标
函数原型:
off_t lseek(int fd, off_t offset, int whence);
需包含的头文件:
#include <sys/types.h>
#include <unistd.h>
参数解释:
int fd:文件描述符
off_t offset:在移动到指定位置之后再进行偏移的偏移量
int whence:移动位置
返回值解释:
若移动成功则返回移动的字节数,若移动失败返回-1
whence介绍:
宏 | 介绍 |
SEEK_SET | 文件头 |
SEEK_END | 文件尾 |
SEEK_CUR | 当前位置 |
函数妙用;
读取文件大小:将文件光标从开头处移到末尾处即可返回文件大小
三.实现cp命令
1.实现步骤
1.打开源文件
2.读取源文件
3.打开目标文件
4.将源文件中读取的数据传入到目标文件
5.关闭目标文件和源文件
注:想要在运行命令时传入参数,必须写main函数原型
int main(int argc, char **argv)
argc:参数总个数
argv:存储参数的数组(注:参数从下标1处开始存储)
2.源代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int fdSrc;
int fdDes;
int size;
char *buf = NULL;
fdSrc = open(argv[1],O_RDWR);
size = lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
buf = (char *)malloc(sizeof(char) * size + 8);
read(fdSrc,buf,size);
fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
write(fdDes,buf,size);
close(fdSrc);
close(fdDes);
free(buf);
return 0;
}
~
四.C语言库标准文件操作
1.C标准文件操作与Linux文件操作的区别
https://www.cnblogs.com/NickyYe/p/5497659.html
2.C标准文件操作API
foen,fwrite,fread,fseek,fclose,feof
1.函数原型
FILE *fopen(const char *pathname, const char *mode);
size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
int fclose(FILE *stream);
int fseek(FILE *stream, long offset, int whence);(使用方法同lseek函数)
int feof(FILE *stream);
2.fopen介绍
参数介绍;
const char *pathname:文件路径
const char *mode:打开方式
mode介绍:
返回值介绍:
成功返回一个文件指针,失败返回NULL
3.fwrite及fread介绍
参数介绍:
void *ptr:缓冲区
size_t size:要写入(读取)一个数据的大小
size_t nmemb:要写入(读取)数据的个数
FILE *stream:要写入(读取)数据的文件
返回值介绍:
若成功则返回写入(读取)的数据个数,失败则返回0
4.feof介绍
功能介绍:
判断文件是否到达末尾
参数介绍:
FILE *stream:要判断的文件
返回值介绍:
若到达末尾返回非零,若未到达末尾返回0