C语言文件操作(一文带你吃透文件各种操作)
创始人
2024-05-12 05:43:04
0

文章目录

一、为什么要使用文件

二、什么是文件

2、1 程序文件

2、2 数据文件

2、3 文件名

三、文件的打开关闭及读写操作

3、1 文件指针

3、2 文件的打开和关闭操作

3、3 文件的读写函数详解

3、3、1 fgetc、fputc函数详解

3、3、2 fgets、fputs函数详解

3、3、3 fscanf、fprintf函数详解

3、3、4 fread、fwrite函数的详解

四、总结


标题:C语言文件操作

作者:@Ggggggtm

寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景

  有很多学校都是不会讲文件操作这块知识的,但是考试还要考。文件操作在平常中也是有所应用的。这篇文章详细讲述对于文件的各种操作,对于考试和平常引用是完全足够啦!

一、为什么要使用文件

   我们前面的文章模拟实现通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。
   这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

二、什么是文件

  磁盘上的文件夹是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件数据文件(从文件功能的角度来分类的)

2、1 程序文件

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

2、2 数据文件

  文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
   本章讨论的是数据文件。在我们处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。

2、3 文件名

  一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀。例如: c:\code\test.txt为了方便起见,文件标识常被称为文件名。

三、文件的打开关闭及读写操作

3、1 文件指针

   缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统
声明的,取名FILE。例如,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;

  不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。下面我们可以创建一个FILE*的指针变量:

FILE* pf;//文件指针变量

  定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。比如:

3、2 文件的打开和关闭操作

  文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。ANSIC 规定使用fopen函数来打开文件fclose来关闭文件。具体我们结合这下面的代码一起理解一下。

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream )//具体实例
/* fopen fclose example */
#include 
int main ()
{FILE * pFile;//打开文件pFile = fopen ("myfile.txt","w");//文件操作if (pFile!=NULL){fputs ("fopen example",pFile);//关闭文件fclose (pFile);}return 0;
}

   我们看到上述代码中,文件操作中有fputs函数,这就涉及到了文件的读写。具体我们接着往下看。

3、3 文件的读写函数详解

  我们先来看一下文件常用的读写函数都有哪些:

  每个函数都有自己的特点,我们来详细看一下。 

3、3、1 fgetc、fputc函数详解

  我们先来看fgetc函数的参数和返回值。

   通过上面我们可以看出,该函数的参数是一个文件指针,该文件指针指向的是我们要读取字符的文件。当读取成功时返回值为该字符的ASCLL码值,读取失败或者读到文件末尾返回EOF。我们在该文件路径底下已经有一个文件,该文件及内容如下图所示:  具体我们看下面的例子: 

#include
int main()
{//读的方式打开test.txt文件FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);ch = fgetc(pf);printf("%c\n", ch);//关闭文件fclose(pf);pf = NULL;return 0;
}

  我们先看一下运行结果,再对结果分析一下。

   我们看到上面是我们三次从文件中读取字符。刚开始时,pf指针指向文件的第一个字符,读完第一个字符过后,pf指针指向下一个字符。则结果即为如上图所视。

  我们再看一下fputc函数的参数和返回值:

  fputc函数就是把一个字符输出到文件中,如果输入成功,返回该字符。如果输入失败,则会返回EOF。

  同样,我们结合下面例子理解一下:

#include
int main()
{//读的方式打开test.txt文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//输入字符到test.txt文件fputc('a', pf);fputc('b', pf);fputc('c', pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

   结果如下:

  我们看到,原来test.txt文件中的字符被覆盖了。当我们使用写入的操作时,原文件的内容会被覆盖。

3、3、2 fgets、fputs函数详解

  fgets、fputs函数与fgetc、fputc函数大同小题,但是又有所不同。fgets、fputs函数是输入和输出一行。我们先看fgets、fputs函数的参数和返回值。

  fputs函数是把一个字符串到文件中,fgets函数是把文件中的字符串输出到字符指针中。我们先看fput的例子。

#include
int main()
{//读的方式打开test.txt文件FILE* pf = fopen("test.txt", "w");if (pf == NULL){perror("fopen");return 1;}//输入字符到test.txt文件fputs("hello\n", pf);fputs("world\n", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

   注意,输出到文件时可以输出换行符,到文件中是有换行的效果,如下图:

  如果没有换行符,则是在一行上显示的,如下图:

  我们再看一下fgets函数,是从文件中读取字符串到字符指针中。在读取中我们还可以自己选择读取字符的个数。我们看下面例子:

#include
int main()
{FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}//读文件//测试一行数据char buf[20] = {0};fgets(buf, 20, pf);printf("%s", buf);fgets(buf, 20, pf);printf("%s", buf);//关闭文件fclose(pf);pf = NULL;return 0;
}

   我们看结果:

虽然我们是读取的20个字符,但是读取只限一行。所以读完一行后不再往下读。 结果如上图所示。

3、3、3 fscanf、fprintf函数详解

  我们先看fscanf、fprintf函数的参数和返回值:

  从上图中,我们可以看到fprintf函数是把一些数据输出到文件中,输出成功返回所输出的个数,如果失败就会返回零。我们先看一下fprintf函数的例子,如下:

#include
struct S
{char name[20];int age;float score;
};int main()
{struct S s = { "zhangsan", 20, 95.5 };FILE* pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen");return 1;}// 格式化的写入文件fprintf(pf, "%s %d %f\n", s.name, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

  我们看一下输出结果:

  从上述例子中我们可以总结一下:fprintf函数与printf参数函数很相似,只不过是fprintf函数是输出到文件中,而printf是输出到屏幕上

  这是我们文件中有“zhangsan 20 95.500000”这些数据,我们再看fscanf函数。fscanf函数是把读取文件中的数据输入到变量上。我们直接看例子:

#include
struct S
{char name[20];int age;float score;
};
int main()
{struct S s = { 0 };FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}//格式化的读取文件fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//打印看数据printf("%s %d %f\n", s.name, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

  我们看结果:    同样我们可以看出,fscanf函数与scanf参数函数很相似,只不过是fscanf函数是从文件中输入到变量中,而scanf是从屏幕上输入到变量中。

3、3、4 fread、fwrite函数的详解

  fread、fwrite函数读写的是以二进制的形式来读写的。fread、fwrite函数读写成功的返回所读写的个数。如果失败就会返回0.我们看参数和返回值。

  第一个参数为要读写的指针,第二个为读写元素的大小,第三个参数为读写的个数,最后一个参数为读写的文件指针。我们直接看例子:

struct S
{char name[20];int age;float score;
};//测试二进制的写函数:fread
int main()
{struct S s = { 0};FILE* pf = fopen("test.txt", "rb");if (NULL == pf){perror("fopen");return 1;}//读文件fread(&s, sizeof(struct S), 1, pf);printf("%s %d %f\n", s.name, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}测试二进制的写函数fwrite
int main()
{struct S s = { "张三", 20, 98.5};FILE* pf = fopen("test.txt", "wb");if (NULL == pf){perror("fopen");return 1;}//写文件fwrite(&s, sizeof(struct S), 1, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

  fread、fwrite函数与上述的函数相似,只不过是读写是以二进制的形式。

四、总结

  上述的总结中,我们主要掌握第三大部分即可。第三部分的文件操作函数非常用的。文件操作的细节较多,这也是相对来说较为麻烦的一项。掌握这篇文章足以应对学校的期末考试和平时的使用。

  希望以上内容对你有所帮助,感谢阅读ovo~

相关内容

热门资讯

农村婚庆的司仪主持词 农村婚庆的司仪主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。在当今不断发展的世...
小品主持串词 小品主持串词范文  小品主持串词(一)  女主持人:首先我向大家介绍一下参加今天xx乡**多彩贵州宏...
我们结婚了的经典台词 关于我们结婚了的经典台词  1、最喜欢的食物,五花肉。  2、我喜欢幼稚的东西victoria(宋茜...
哈利波特中魔法石经典台词 哈利波特中魔法石经典台词  在当下社会,需要使用台词的场合越来越多,台词起着揭示人物性格,表达思想感...
企业开业主持词 企业开业主持词  主持词是主持人在节目进行过程中用于串联节目的串联词。在当下这个社会中,主持人在各种...
欢送退休职工致辞 欢送退休职工致辞(通用5篇)  在日常学习、工作和生活中,要用到致辞的情况还是蛮多的,致辞要注意人物...
演出节目串词2文 演出节目串词2文(男)尊敬的领导、老师、亲爱的同学们。 (合)大家好。 (女)当鲜红的太阳跃上地平线...
庆祝百岁老人生日的致辞 庆祝百岁老人生日的致辞范文(精选5篇)  在生活、工作和学习中,大家总免不了要接触或使用致辞吧,致辞...
《夏有乔木雅望天堂》的经典台... 《夏有乔木雅望天堂》的经典台词  《夏有乔木雅望天堂》经典台词一  1. 一个等了,却等得太早,一个...
中秋节的主持词 中秋节的主持词  主持人在台上表演的灵魂就表现在主持词中。在当下的中国社会,很多场合都需要主持人活跃...
无间道台词 无间道台词  说好了三年,三年之后又三年,三年之后又三年,都快十年了,老大!  出来跑,迟早要还的。...
六十岁生日宴会致辞 六十岁生日宴会致辞(通用10篇)  在学习、工作或生活中,要用到致辞的情况还是蛮多的,致辞讲求条理性...
终极三国的经典台词 终极三国的经典台词  1.如此如此,这般这般~  2.我姓刘名备,字玄德,是中山靖王的儿子,因为家道...
团代会主持词 团代会主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。现今社会在不断向前发展,主...
《剑雨》经典台词盘点 《剑雨》经典台词盘点  1、生未必乐,死未必苦。  2、未来已成现在,现在已成过去,随心而去。  3...
幼儿园园长开园致辞 幼儿园园长开园致辞  在日常学习、工作和生活中,大家都不可避免地会接触到致辞吧,致辞是指在仪式上所讲...
辩论赛主持人主持词开场白 辩论赛主持人主持词开场白  辩论赛怎么能没有我们主持人呢?下面是小编搜集整理的辩论赛主持人主持词开场...
李白凤求凰特殊台词 李白凤求凰特殊台词  在王者荣耀中每个英雄人物都有台词,那么李白凤求凰特殊台词是什么呢?以下是小编整...
学生读书交流会主持词 学生读书交流会主持词  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在当下的中国社会...
晚会的闭幕词 晚会的闭幕词(精选16篇)  主持词是主持活动的必备稿子,是活跃气氛,引导活动进行的存在,下面是小编...