fopen函数mode模式说明以及与open函数区别
函数头文件:
#include <stdio.h>
函数原型:
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
mode具体的有
"r"(只读模式打开),
“r+"(读写模式打开),
"w"(只写模式打开,如果不存在会新建,如果有会内容清零),
"w+"(读写模式打开,如果不存在会新建,如果有会内容清零),
"a"(追加模式只写),
"a+"(追加模式读写),
"b"(二进制文件打开,在Linux加不加此模式无区别。
window下有区别,回车换行符“0x0A”和“0x0D 0x0A”,例如如果原始文件为二进制(0x0A),拷贝到不以二进制打开的文件时,0x0A会被转成Ox0D 0x0A,导致文件变大)
fopen 是标准的C 函数,用来操作普通的磁盘文件,设有缓冲,返回的是指向文件结构的指针。
open是Linux下的系统调用,比fopen处于更低级的位置,没有设缓冲,返回的是文件句柄,即在文件描述副表的索引,除了操作普通磁盘文件,还可以操作字符设备,网络套接字等设备文件
open是低级IO,fopen是高级IO。
open返回文件句柄,fopen返回文件指针。
open无缓冲,fopen有缓冲。
open对应read和write, fopen对应fread和fwrite.
open需要切换内核态和用户态,fopen不需要。
引用介绍缓冲文件系统和非缓冲文件系统:
缓冲文件系统
缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器 而定。
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
非缓冲文件系统
缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数 据。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度 快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它。open, close, read, write, getc, getchar, putc, putchar 等。