提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、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;
}