一 文件的基本操作
1 文件打开操作
//open需要包含的头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
//需要打开的文件名(包含路径)//文件权限 只读O_RDONLY 只写O_WRONLY 可读可写O_RDWR
//返回文件描述符
int open(const char *pathname, int flags, mode_t mode);
2 文件写入操作
//write需要包含的头文件
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
//向open返回的文件描述符里 写buf 写count这么大
3 文件读取操作
//read需要包含的头文件
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
//从fd中读取内容到buf中 读count这么大
4 文件光标操作
//lseek需要包含的头文件
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
//操作的文件 //偏移值 //光标的位置 SEEK_SET文件头 SEEK_END 文件尾 SEEK_CUR当前光标位置
//lseek 返回的偏移量
5.判断文件是否存在
//O_EXCL与O_CREAT连用 判断文件是否存在
fd = open("./file",O_RDWR|O_CREAT|O_EXCL,0600);
//如果file存在 返回-1
//如果file不存在 啥都不返回
6.在原文件后追加内容
//O_APPEND
fd = open("./file",O_RDWR|O_APPEND);
7.把原文件内容换掉
//O_TRUNC
fd = open("./file",O_RDWR|O_TRUNC
8.创建文件
//creat
int creat(const char *pathname, mode_t mode);
//要创建的文件名 //创建模式 1可读S_IRUSR 2可写S_IWUSR 3可执行S_IXUSR 4可读可写可执行S_IRWXU
二 文件描述符:
1.对于内核而言,所有打开文件都是由文件描述符引用的。文件描述符都是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write.
2.文件描述符的作用域就是当前进程,出了这个进程文件描述符就没有意义了。
Linux系统默认:0代表进程的标准输入(键盘输入)
1代表进程的标准输出
2代表进程的标准错误
文件的过程:
1.文件平时是存放在块设备中的文件系统文件中的(磁盘中),我们把这种文件叫静态文件,当我们去open一个文件时,linux内核做的操作包括:内核在进程中建立一个文件的数据结构(结构体),记录下我们打开的文件;内核在内存中申请一段内存,并且将静态文件的内容从块设备中读取到内核中特定地址管理存放(叫动态文件)。
2.打开文件以后,以后对这个文件的操作,都是针对内存中的这一份动态文件的,而不是针对静态文件的。当然我们对动态文件进行读写以后,此时内存中动态文件和块设备文件中的静态文件就不同步了,当我们close关闭动态文件时,close内部内核将内存中的动态文件的内容去更新(同步)块设备中的静态文件。
3.为什么这么设计,不直接对块设备直接操作?块设备本身读写非常不灵敏,是按块读写的(块字节比较大),而内存是按字节单位操作的,而且可以随机操作,很灵敏。
三 实现Linux cp命令的代码
a.打开一个原文件(src.c)argv[1]
b.读原文件(src.c)->buf中
c.创建目标文件(des.c)argv[2]
d.将buf写到目标文件(des.c)
e.close两个文件
四 配置文件修改
a.打开配置文件
b.读配置文件->buf中
c.在buf中修改
d.修改完再写到配置文件中
e.close配置文件
五 标准C库
1.来源角度:open是linux系统调用函数,返回的是文件描述符。
fopen是标准的C语言库函数,在不同的操作系统中应该调用不同的api。返回的是一个指向文件结构的指针。
2.移植性:在linux系统,用open.在windows用creatFile。
fopen是C标准函数,因此拥有良好的移植性。
3. fopen
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
// FILE *fp = fopen("文件名","w+");
//返回文件流 //文件名 //权限
4.fwrite
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
//要写的数据缓存 //2,3表示 字节数 //写到这里
//fwrite(str,sizeof(char),strlen(str),fp)
//fwrite(str,sizeof(char)*strlen(str),1,fp)
5.fread
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//读到这里 //2,3读这么大 //读到这里
//fread(readBuf,sizeof(char),strlen(str),fp);
6.fseek
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
//操作的文件 //偏移量 //位置
//fseek(fp,0,SEEK_SET);
7.fputc
#include <stdio.h>
int fputc(int c, FILE *stream);
//向FILE *stream 写入int c
8.feof
判断是否到文件尾巴
没有到达文件尾巴返回0
9.fgetc
int fgetc(FILE *stream);
//从FILE *stream输出