1.核心理论 -文件描述符
在中国,每一个成年的公民都会有一个身份证编号,它的本质就 是一个数字,我们可以利用这个数字来标记这个公民。在Linux系 统中,所有打开的文件也对应一个数字,这个数字由系统来分配, 我们称之为:文件描述符
2.函数学习-文件操作
打开文件
函数名 : open()函数
函数原形:
int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);
函数功能:
用于打开或者创建一个文件
所属头文件:
<sys/types.h> <sys/stat.h> <fcntl.h>
返回值:
Success:文件描述符 Fail: -1
参数说明:
Pathname:要打开的文件名(含路径,缺省为当前路径) Flags:文件打开的标志: O_APPEND:以追加方式打开文件 O_CREAT:当文件不存在,创建一个新文件 o_RDONLY:只读方式打开 O_WRONLY:只写方式打开 O_RDWR:读写方式打开 O_NOBLOCK:非阻塞方式打开。 Mode:一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的访问权限
创建文件
函数名: creat()
函数原形
int creat(const char *filename,mode_t mode)
函数功能
创建文件
所属头文件
<sys/types.h> <sys/stat.h> <fcntl.h>
返回值
Success:文件描述符 Fail: -1
参数说明
filename:要创建的文件名(包含路径、缺省为当前路径) mode: 创建模式 //可读可写可执行 常见创建模式: 宏表示 数字 S_IRUSR 4 可读 S_IWUSR 2 可写 S_IXUSR 1 可执行 S_IRWXU 7 可读、写、执行
关闭文件
函数名 close()
函数原形
Int close(int fd) //关闭一个打开的文件
函数功能
关闭一个打开的文件
所属头文件
<unistd.h>
返回值
Success:0 fail:-1
参数说明
Fd:待关闭的文件描述符 //从系统open调用返回来的
读文件
函数名: read()
函数原形
size_t read(int fd,void *buf,size_t count)
函数功能
从一个打开的文件中读取数据
所属头文件
<unistd.h>
返回值
cnt:返回读取的字节数 fail:-1
参数说明
Fd: 要读取数据的文件的描述符 Count:希望读取的字节数 Buf: 读取来的数据存到buf指向的空间
写文件
函数名 write()
函数原形
size_t write(int fd,void *buf,size_t count)
函数功能
写入到文件
所属头文件
<unistd.h>
返回值
返回写入到文件的字节数。 Fail:-1
参数说明
Fd: 要写入数据的文件的描述符 Buf: 要写入的数据存放位置 Count:希望写入的字节数
文件定位
函数名 lseek()
函数原形
Off_t lseek(int fd,off_t offset,int whence)
函数功能
将文件读写指针相对whence移动offset个字节。
所属头文件
<sys/types.h> <unistd.h>
返回值
Success: 返回移动后的文件指针距离文件头的位置 Fail:-1
参数说明
Fd: 需要重新定位的文件的描述符 Offset:在其实位置基础上设置的偏移量(向前移动时是负值、向后移动是正值) Whence:设置文件偏移指针开始移动的位置 SEEK_SET:开始偏移的起始位置为文件头 SEEK_CUR:开始偏移的起始位置为目前的位置 SEEK_END:开始偏移的起始位置为文件尾//计算文件长度
复制文件描述符
函数名 dup
函数原形
Int dup(int oldfd); Int dup2(int oldfd,int newfd);
函数功能
复制一个文件描述符
所属头文件
<unistd.h>
返回值
Success:返回新的文件描述符 fail:-1
参数说明
oldfd: 待复制的老的文件描述符
文件复制程序
#include <stdio.h> #include <fcntl.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> int main(int argc, char *argv[]) { int fd1, fd2; int count, count2; char buffer[1024] = {0}; char *ptr; if (argc != 3) { printf("Usage: %s file1 file2\n", argv[0]); return 1; } if (-1 == (fd1 = open(argv[1], O_RDONLY))) { perror("open file1\n"); close(fd1); return 2; } if (-1 == (fd2 = open(argv[2], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR))) { perror("open file2\n"); close(fd2); return 3; } while (count = read(fd1, buffer, 1024)) { if (-1 == count) { perror("read"); return 4; } ptr = buffer; int count2 = write(fd2, ptr, count); if (-1 == count2) { perror("write\n"); return 5; } memset(buffer, 0, 1024); } close(fd1); close(fd2); return 0; }