• 文件的操作方法


    所谓文件,指的是存储在硬盘上的数据块。

    文件的分类

    根据读写方式:

    • 随机文件:数据读写是任意的,只要能定位到位置,就可以直接读写;
    • 顺序文件:文件的读写必须是连续的,不能跳跃。

    根据数据存放格式:

    • 文本文件:将数据按单个字符存储。例如,对于整数5236,分别存储’5’,‘2’,‘3’,‘6’,共占用4字节。
      在这里插入图片描述
    • 二进制文件:将数据转换为二进制存储。例如,对于整数5236,将十进制5236转换为二进制后是“1010001110100”,共占用2个字节。
      在这里插入图片描述

    由此可见,文本文件占用空间比二进制大,进行ASCII码也要额外耗费时间,但是利于处理单个字符。
    只有数字存储会有区别,字符存储都是使用ASCII码存储,两种文件存储方式占用一样。

    文件指针

    文件指针是一种特殊指针,使用结构体来完成的:

    FILE *a;
    a=fopen("edit.txt","r");
    
    • 1
    • 2
    struct _iobuf {
    ​​​​​​​​        char *_ptr;//文件输入的下一个位置
    ​​​​​​​​        int    _cnt;//当前缓冲区的相对位置
    ​​​​​​​​        char *_base;//文件的起始位置
    ​​​​​​​​        int    _flag;//flag是文件标志位
    ​​​​​​​​        int    _file;//file是文件的有效性
    ​​​​​​​​        int    _charbuf;//缓冲区检查
    ​​​​​​​​        int    _bufsiz;//文件大小
    ​​​​​​​​        char *_tmpfname;//临时文件名
    ​​​​​​​​        };
    ​​​​​​​​typedef struct _iobuf FILE;​​
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    文件的打开关闭操作

    1)定义文件指针;
    2)打开文件;
    3)读写文件;
    4)关闭文件。

    打开文件:

    FILE *fopen(const char *fname,const char *mode);
    
    • 1

    其中fname是要打开的文件名,mode指文件的打开方式
    在这里插入图片描述

    关闭文件:

    int fclose(FILE *fp);
    
    • 1

    关闭成功,返回0,否则返回-1。
    fclose把缓冲区的内容输出到磁盘中,释放文件指针和有关缓冲区。如果没有使用fclose关闭文件,那么可能因为缓冲区没满导致数据丢失。

    案例:

    #include
    int main()
    {
    	FILE *fp;
    	fp=fopen("edit.txt","r");
    	if(fp==NULL)
    	{
    		printf("打开文件失败\n");
    		fp=fopen("edit.txt","wr");
    		if(NULL==fp)
    		{
    			printf("创建文件失败\n");
    			return 0;
    		}
    		printf("打开文件成功\n");
    		fclose(fp);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    打开文件失败
    打开文件成功
    
    • 1
    • 2

    EOF和FEOF的区别

    在C语言中,EOF是这样的:

    #define EOF (-1)
    
    • 1

    EOF只能用作文本文件的结束标志,因为文本文件使用ASCII码作为结束标志,而ASCII码中不会出现-1。
    EOF不仅可以判断文本文件是否结束,还能判断输入是否完成:

    while((c=getchar())!=EOF)
    {
    	...
    }
    
    • 1
    • 2
    • 3
    • 4

    正常输入都会是正常调用,只有按下CTRL+C时会返回-1,所以EOF还可以判断输入结束。

    但是在二进制文件中,不能采用EOF作为文件结束符,因为二进制文件中会出现-1。

    因此,判断文件的结束,使用FEOF标志符:

    #define _IOEOF             0x0010
    #define feof(_stream)      ((_stream)->_flag & _IOEOF)​​
    
    • 1
    • 2

    文件指针的位置是使用成员变量_ptr来标识的,当文件指针到达文末并读写时,文件的状态标识符会被置位_IOEOF

    FILE *fpin;
    char c;
    fpin=fopen("data.dat","rb");
    while(!feof(fpin))
    {
    	//这个printf有说法,如果放在c=getc(fpin);下边,就会多输出一个FFFFFFFF数据,所以逻辑是先读取再判断,而不是先读取再输出再判断。
    	printf("%x\n",c)//getc的作用是读取一个字节,并前进一个指针
    	c=getc(fpin);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    文件的读写操作

    读写字符

    int fputc(int ch,FILE *fp);
    
    • 1

    向文件流写入一个字符,成功返回写入的字符,失败返回EOF。

    int fgetc(FILE *fp);
    
    • 1

    从文件流中读取一个字符,返回读取的字节,如果到文件末尾就返回EOF。

    读写字符串

    int fputs(char *string,FILE *fp);
    
    • 1

    将string指向的字符串写入fp所指定的文件中。

    char* fgets(char *s,int size,FILE *fp);
    
    • 1

    从文件中读取size个字符存到s中,直到出现换行符、文件尾或已读的size-1个字符为止,最后加上NULL表示字符串结束,成功返回0,失败返回非0。

    读写磁盘

    int fscanf(FILE *fp,char *format,[argument...]);
    
    • 1

    向fp文件指针指向的文件中写入字符,成功返回读出的个数,失败返回EOF。

    int fprintf(FILE *fp,char *format[,argument]);
    
    • 1

    根据指定的格式format写入参数到fp指向的文件中,成功返回输出的字符数,失败返回负数。

    读写块

    size_t fwite(const void *buffer,size_t size,size_t count,FILE *fp);
    
    • 1

    将数据块写入文件。
    buffer是数据地址,size是一次写入的字节数,count是写入次数,fp是文件。
    成功返回写入的字节数。

    size_t fread(void *buffer,size_t size,size_t count,FILE *fp);
    
    • 1

    从fp文件中读取一个数据块。
    buffer是要读入的地址,size是要读取的字节数,count是要读取的个数。

    块读写和字符串读写的区别是:
    块读写按个数读写;
    字符串读写按结束符\0读写。

    位置指针

    void rewind(FILE *fp);
    
    • 1

    将位置指针重新定位到文件开头。

    int fseek(FILE *fp,long offset,int fromwhere);
    
    • 1

    fp是文件指针,offset是相对fromwhere的偏移量,fromwhere的取值如下:
    在这里插入图片描述

    long ftell(FILE *fp);
    
    • 1

    返回位置指针相对于文件首的偏移字节数。

    文件的错误检查

    int ferror(FILE *fp);
    
    • 1

    检查fp指向的文件是否有读写错误,没错返回0,出错返回非0.

    void clearerr(FILE *fp);
    
    • 1

    恢复错误标志。

    void perror(const char *s);
    
    • 1

    输出上一次错误到stderr,输出时先输出s指定的字符串。

    char *strerror(int errnum);
    printf("%s\n",strerror(errno));
    
    • 1
    • 2
    出错信息为:No such file or directory​​
    
    • 1

    将错误信息以字符串形式显示。

  • 相关阅读:
    大学各个专业介绍
    地方/园区产业规划之 “ 如何进行产业定位 ”
    java毕业生设计学术会议信息网站计算机源码+系统+mysql+调试部署+lw
    Redis Cluster集群方案
    nodejs+vue+elementui宠物医院管理系统php-java-python
    一个怪异的笔记本重启死机问题分析
    第九章:最新版零基础学习 PYTHON 教程—Python 元组(第五节 -清除元组的5种方式方法)
    7 种查询策略教你用好 Graph RAG 探索知识图谱
    【面试题精讲】SpringBoot的传播机制详解
    基于JARM指纹的C2识别
  • 原文地址:https://blog.csdn.net/weixin_39759247/article/details/126158129