标准库中打开文件函数的原型:
#include <stdio.h>
FILE *fopen(const char *restrict pathname, const char *restrict type);
FIEL *freopen(const char *restrict pathname, const char *restrict type, FILE *restrict fp);
FILE *fdopen(int filedes, const char *type);
//三个函数返回值:若成功返回文件指针,出错返回NULL
fopen函数打开pathname指定的文件,打开类型为type
type参数指定对该IO流的读写方式,但这里却是很容易搞混淆的地方。
首先说几种常用的情形:
1.文件是存在硬盘上的公共资源,一个用户创建的每个进程都可以打开该文件,都可以读写该文件,这容易造成文件访问的冲突
2.文件的操作就两种,读或者写,大多数场景只使用其中的一种,例如:cat命令是只读文件,管道就是一个读一个写,同时读写的情况比较少
3.文件是否存在是一个问题?当只读而打开一个文件时,若文件不存在,就更别谈读取了,这个肯定是个错误;当只写而打开一个文件,若文件不存在,就可以创建一个文件,然后再往文件内写,但读却不能够创建一个文件,再从文件内读,就算读也只是读到文件尾。例如 echo “hello” > hello.txt 这样的一个命令,文件不存在是常有的事,此时就会创建文件
4.文件写的时候也会出问题?若文件存在,只写而打开,必定会覆盖写如的位置的文件内容,同时还会有多个进程同时写的冲突。
5.文件还分为二进制文件和文本文件
由上述原因,就衍生出了文件的操作方法:
r | rb | 为读而打开;此打开的权限只能读,单个读和单个写的文件应用的比较多,但若文件不存在就会打开失败 |
w | wb | 为写而打开;此打开的权限只能写,若文件不存在则创建,新创建的文件长度本就是0,若文件存在就将其截短为0,是在文件头写 |
a | ab | 为追加而打开;只能在文件尾写,同写权限一样,文件不存在则创建,存在却不截短为0,定位到文件尾写 |
r+ | r+b | +是为读写而打开,默认的附加操作为r的操作,文件不存在则打开失败 |
w+ | w+b | +是为读写而打开,默认的附加操作为w的操作,文件不存在则创建,存在则截短为0 |
a+ | a+b | +是为读写而打开,默认的附加操作为a的操作,文件不存在则创建,存在则定位到文件尾 |
注:b表示是二进制文件
所以基本的操作方式是rwa,读写追加,但type类型是字符串指,只能取这里列出来的几种,却没有这样的调用fopen("test","rw"),想为读写而打开,但却不能用rw作为类型值,C编译器是不判断字符串的值,这里不会报错,但rw却是得不到我们想要的为读写而打开的文件,读写打开只能用+,然后附加基本的文件判断操作。
type = "r" | "w" | "a" | "rb" | "wb" | "ab" | "r+" | "w+" | "a+" | "r+b" | "w+b" | "a+b" | "rb+" | "wb+" | "ab+"
type只能取这15个值,其他的值得不到期望的文件操作权限