目录
  • 1.为什么使用文件
  • 2.什么是文件
    • 2.1文件分类
    • 2.2 文件名
  • 3.文件的打开和关闭
    • 3.1文件指针
    • 3.2 如何使用文件指针
  • 4.文件的读写

    1.为什么使用文件

    大家在写程序的时候有没有一个困惑,就是我写的程序,输入一些数据后,当我把程序关掉以后数据就消失了。这是因为程序运行时,所有的数据都存储在内存中,当程序退出后,程序中的数据自然就不存在了。等下次再运行程序时,又要重新录入数据,非常难受

    ​ 如何解决这个问题呢,我们可以学习使用文件来将其保存

    2.什么是文件

    2.1文件分类

    在程序设计中,一般将文件分为两部分:程序文件和数据文件

    程序文件:

    包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

    数据文件:

    文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件或者输出内容的文件

    这次我们想要聊的是第二种数据文件,它可以帮助将我们运行时的数据存储到磁盘中,以便我们下次使用

    2.2 文件名

    每一个文件都有自己的名字,它由三部分组成

    文件路径+文件名主干+文件后缀

    c:\code\test.txt

    3.文件的打开和关闭

    3.1文件指针

    想要打开一个文件,我们需要使用到文件指针,该指针是由系统声明的,例如,VS2013编译环境提供的 stdio.h 头文件中有以下的文件类型申明

    struct _iobuf {
            char *_ptr;
            int   _cnt;
            char *_base;
            int   _flag;
            int   _file;
            int   _charbuf;
            int   _bufsiz;
            char *_tmpfname;
           };
    typedef struct _iobuf FILE;
    

    相信很多人看到这里,已经不想再读下去了,坚持一下,前面这些并不重要

    3.2 如何使用文件指针

    首先我们需要定义一个文件指针

    FILE* pf
    

    想要将数据存储到文件中或者从文件中读取数据,我们先要将文件打开,ANSIC 规定使用fopen函数来打开文件。

    FILE * fopen ( const char * filename, const char * mode );
    

    filename: 文件名

    mode : 文件的打开方式

    下面是一些常见的mode

    文件使用方式 含义 如果指定文件不存在
    “r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
    “w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
    “a”(追加) 向文本文件尾添加数据 建立一个新的文件
    “rb”(只读) 为了输入数据,打开一个二进制文件 出错
    “wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
    “ab”(追加) 向一个二进制文件尾添加数据 出错
    “r+”(读写) 为了读和写,打开一个文本文件 出错
    “w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
    “a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
    “rb+”(读写) 为了读和写打开一个二进制文件 出错
    “wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
    “ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

    注:这里的输入是指将数据写到内存中,输出是写到文件中

    3.读写数据后使用fclose关闭文件。

    int fclose ( FILE * stream );
    
    // 示例
    #include <stdio.h>
    int main ()
    {
      FILE * pFile;
      //打开文件
      pFile = fopen ("myfile.txt","w");
      //文件操作
      if (pFile!=NULL)
     {
        fputs ("fopen example",pFile);
        //关闭文件
        fclose (pFile);
     }
      return 0; 
    }
    

    4.文件的读写

    现在我们知道了,如何去打开一个文件,那么如何将它的数据输入到程序中呢?

    首先我想介绍一些函数

    功能 函数名 适用于
    字符输入函数 fgetc 所有输入流
    字符输出函数 fputc 所有输出流
    文本行输入函数 fgets 所有输入流
    文本行输出函数 fputs 所有输出流
    格式化输入函数 fscanf 所有输入流
    格式化输出函数 fprintf 所有输出流
    二进制输入 fread 文件
    二进制输出 fwrite 文件

    看不懂? 没关系,接下来我将用一个示例告诉你如何使用。

    //这是我以前写通信录时用到的一些方法
    typedef struct Contact
    {
    	struct contact_person* data;
    	int count;	//通讯录中人员个数
    	int capacity;
    }Contact;//通讯录类型的指针
    
    void Save(Contact* con) //将数据存储到文件中
    {
    	FILE* fp = fopen("contact.txt", "wb");
    	if (fp == NULL)
    	{
    		printf("Save()::%s", strerror(errno)); //如果打开失败,报错
    		return;
    	}
    	else
    	{
    		fwrite(con->data, sizeof(struct contact_person), con->count, fp);//将数据写到contect.txt中
    	}
    	fclose(fp); //关闭文件
    	fp = NULL;
    }
    
    void Load(Contact* con) //将文件中的数据加载到内存中
    {
    	FILE* fp = fopen("contact.txt", "r");
    	if (fp == NULL)
    	{
    		printf("Load()::%s", strerror(errno));
    		return;
    	}
    	else
    	{
    		struct contact_person tmp;
    		while (fread(&tmp, sizeof(struct contact_person), 1, fp))// fread的返回值为读到数据的个数,用来判断是否继续读取
    		{
    			Check_capacity(con);//检测通讯录容量是否足够
    			con->data[con->count] = tmp;
    			con->count++;
    		}
    	}
    	fclose(fp);
    	fp = NULL;
    }
    
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。