fopen是基于ANSIC标准C的的API
open是UNIX系统的API的区别
这里重点运用fopen等ANSIC标准C的的API,open等UNIX系统的API可参考主页文章
1.层次不同
open是系统调用,返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,
fopen是ANSIC标准中的C语言库函数,返回的是一个指向文件结构的指针)。在不同的系统中应该调用不同的内核api。linux中的系统函数是open,fopen是其封装函数,fopen的实现要调用open。标准C库.
2.fopen和open最主要的区别是是否有缓存
fopen用户态下就有了缓存,它使用了FILE这个结构保存缓冲数据。在进行read和write的时候减少了用户态和内核态的切换。
open没有缓存,每次读操作都直接从文件系统中获取数据。在进行read和write的时候每次都需要进行内核态和用户态的切换。
表现为,如果顺序访问文件,fopen系列的函数要比直接调用open系列快;如果随机访问文件open要比fopen快。
3.一般用fopen打开普通文件,用open打开设备文件。
fopen函数原型和头文件
#include <stdio.h>FILE *fopen(const char *path, const char *mode);
返回值:fopen函数返回新打开文件的文件指针;如果此文件不能打开,则返回NULL指针。
参数:path: 要打开的文件路径
mode: 访问文件的模式, 它包括:
代码实现
#include <stdio.h>#include <string.h>int main()
{//FILE *fopen(const char *path, const char *mode);FILE *fp;char *str="zhengyanfeng handsome";char readBuf[128]={0};fp=fopen("./zheng.txt","w+");//size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);//ptr buf//size sizeof char//geshu//which filefwrite(str,sizeof(char),strlen(str),fp);fseek(fp,0,SEEK_SET);// fwrite(str,sizeof(char)*strlen(str),1,fp);//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);fread(readBuf,sizeof(char)*strlen(str),1,fp);printf("read data:%s\n",readBuf);return 0;
}