open 系列API 和 fopen系列API的区别
1.来源:
-open 是UNIX系统调用函数(包括LINUX系统),返回的是文件描述符
-fopen是ANSIC标准的C语言库函数,在不同系统重调用不同内核的API
2.移植性:
fopen 是C标准函数,具有良好的移植性;
而opne是unix系统调用,移植性有限(砸死window下运行怒了,可以用功能一样的CreateFile调用)
3.适用范围:
open返回文件操作符,在unix系统下使用,可以硬件设备对接
fopen 用来操作普通正规文件
4.文件IO层次:
open里系统内核更接近,属于低级文件IO,运行在内核态,高级文件IO运行在用户态(缓冲区)
5.缓冲:
fopen --缓冲文件系统,设置文件结构体指针, 等一堆f开头的api都是在缓冲区运行 -- 执行速度快,效率高。
open --非缓冲文件系统,无文件结构体指针,值读写二进制文件,效率高,速度快
总结: open 无缓冲,fopen有缓冲
由于fopen渔鸥缓冲,减少了用户态和内存太的切换,而open每次都需要切换;
if 顺序访问文件的话,fopen的效率更高,随机访问的话计算open的效率高
==================================================
fopen系列API调用:
fopen:
FILE *fopen(char *filename,char *mode);
=============================
#include<stdio.h>
#include<string.h>
int main()
{
FILE * fp;
char *str="mxjun hen shuai!";
char readBuf[128]={0};
fp=fopen("./mxj.txt","w+");
fwrite(str,sizeof(char),strlen(str),fp);
fwrite(str,sizeof(char)*strlen(str),1,fp);
fseek(fp,0,SEEK_SET);
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread(readBuf,sizeof(char),strlen(str),fp);
printf("read data:%s\n",readBuf);
fclose(fp);
return 0;
}
==================
标准C库结构体写入文件:
//读写返回值的区别:
指定 写的个个数 > 实际 接收到的个数,返回值是大值(不够写了'\0'补充)
而指定读的个数更大,返回值只能是小者,算指定最大读取数
#include<stdio.h>
#include<string.h>
struct Test
{
int a;
char b;
};
int main()
{
FILE * fp;
struct Test data ={100,'a'};\
struct Test data2;
fp=fopen("./mxj.txt","w+");
fwrite(&data,sizeof(struct Test),1,fp);
fseek(fp,0,SEEK_SET);
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread(&data2,sizeof(struct Test),1,fp);
printf("read data2:%d %c\n",data2.a,data2.b);
fclose(fp);
return 0;
}
===========================
fputc() -- 一次将一个字符的写入文件
函数原型:
int fputc(int c, FILE *stream);
#include <stdio.h>
#include<string.h>
int main()
{
FILE *fp;
int i;
char *str="mxjun giegie!!!";
int len=strlen(str);
fp = fopen("./stest.txt", "w+");
for(i=0;i<len;++i)
{
fputc(*str,fp);
str++;
}
fclose(fp);
return 0;
}
feof() fgetc()
feof() -- 判断是否到文件尾巴 --到尾巴返回0
fgetc() --读取文件字节
#include <stdio.h>
#include<string.h>
int main()
{
FILE *fp;
int i;
char c;
fp = fopen("./stest.txt", "r");
while(!feof(fp)){
c=fgetc(fp);
printf("%c",c);
}
fclose(fp);
return 0;
}