提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、open与fopen的区别是什么?
- 来源
- 移植性
- 适用范围
- 文件IO层次
- 缓冲
- 二、fopen fwrite fread具体使用
- 2.用标准C库写入结构体到文件
- fputc feof
一、open与fopen的区别是什么?
open是UNIX系统调用函数(windows下没有)
fopen是ANSIC标准中的C语言库函数
移植性
fopen是C标准函数,因此拥有良好的移植性,而open是UNIX系统调用,移植性有限。
适用范围
open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件(Regular File)。
fopen是用来操纵普通正规文件(Regular File)的。
文件IO层次
如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。
fopen是在自己的缓冲区执行。
open是通过向内核发送指令来执行。
缓冲
open无缓冲,fopen有缓冲
使用fopen函数,由于在用户态下就有了缓冲,因此进行文件读写操作的时候就减少了用户态和内核态的切换
但是现如今的电脑的性能配置逐渐提升,这种快慢的体现微乎其微
二、fopen fwrite fread具体使用
#include<stdio.h>
#include<string.h>
int main()
{
//FILE *fopen(const char *path, const char *mode);
FILE *fp; //他的文件描述符返回类型 为FILE类型
char *str="zheng xing yu haha";
char readBuf[128]={0};
fp=fopen("./zxy.txt","w+"); //第一个参数为打开文件的地址 第二参数为打开模式
//mode中有很多种权限 例如 r 只读 w只写 w+可读可写方式创建一个文本文件
//r+可读可写方式打开一个文本文件 还其他不做详细介绍
//size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
int nwrite=fwrite(str,sizeof(char),strlen(str),fp);
//与write不同的是 文件描述符的位置在最后 第二个参数第三个参数分别为 写入大小和 (多了一个写入次数)写入次数
//另外一种写法为 fwrite(str,sizeof(strlen(str)),1,fp) 可以一次写入全部内容
fseek(fp,0,SEEK_SET); //这里还是老规矩 将被推至文件末尾的光标重置到文首
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//读和写差不多 将读的内容放到readBuf里
int nread=fread(readBuf,sizeof(char),strlen(str),fp);
printf("%s\n",readBuf);
printf("nwrite:%d nread:%d",nwrite,nread);
//这里的nwrite nread受第三个参数写入次数的影响
return 0;
}
2.用标准C库写入结构体到文件
代码如下(示例):
#include<stdio.h>
#include<string.h>
struct Test
{
int a;
char c;
};
int main()
{
FILE *fp;
struct Test data={100,'a'};
struct Test data2;
fp=fopen("./file1","w+");
fwrite(&data,sizeof(struct Test),1,fp);
//这里把data的内容写到缓冲区 结构体需取地址
fseek(fp,0,SEEK_SET);
fread(&data2,sizeof(struct Test),1,fp);
printf("data2 a:%d c:%c",data2.a,data2.c);
return 0;
}
fputc feof
#include<stdio.h>
#include<string.h>
int main()
{
FILE *fp;
int i;
char *str="haohaoxuexi tiantianxiangshang";
int len=strlen(str);
//这里提前用len保存长度供循环使用,如果用i<strlen(str)由于str++的时候str的长度会有变化 所以在这里提前声明
fp=fopen("./test.txt","w+");
// int fputc(int c, FILE *stream);
for(i=0;i<len;i++){
fputc(*str,fp);
//利用循环将多个字符写入
str++;
}
fclose(fp);
return 0;
}
feof用来判断是否到达文件末尾
#include<stdio.h>
#include<string.h>
int main()
{
FILE *fp;
fp=fopen("./test.txt","r");
char c;
while(!feof(fp)){
//feof函数用来判断是否到文件末尾 没到返回值为0 所以取反为非零 继续读取字符
//到了返回值非零 取反为0 循环结束
c=fgetc(fp);
printf("%c",c);
}
fclose(fp);
return 0;
}