目录
编辑 fgetc()、fputc()与fgets()、fputs()的区别
为什么要学习文件操作?
大家在运行通讯录等程序时,有没有发现这样一个问题:当我们运行程序并输入诸多联系人后结束程序,数据无法保留,当程序结束,我们输入的数据就会被清空。那么怎样才能将数据保留下来呢?这就是我们接下来要学习的内容。
什么是文件?
文件一般分为程序文件和数据文件。
程序文件:例如Windows环境下的源程序文件(.c),目标文件(.obj),可执行文件(.exe)。
数据文件:程序运行时读写的文件。之前我们学习的是从键盘输入数据,从显示屏输出数据。现在我们学习对磁盘上的文件进行输入输出。
文件指针
系统对每一个被使用的文件都会在内存上创建文件信息区,存放文件的相关信息。这些信息存放在一个结构体变量中,该结构体取名为FILE,对于该结构体变量的具体实现我们不需要深度追究。
FILE* pf;//文件指针变量
我们要访问某个文件的时候,可以定义一个指针变量指向该文件的文件信息区。
接下来我们讲解如何操作指针变量。
文件的操作
打开方式
文件操作的诸多函数
文件操作的函数十分之多,我们选择其中几个进行讲解:
fgetc()与fputc 实例
fgetc()为输入函数,fputc()为输出函数,注意:此处的输入输出是以磁盘上的文件为主体,即输出是向文件中写入文件,输入是从文件中读取文件。
执行写入代码fputc()
//fputc()
int main()
{
FILE* pf = fopen("date.txt", "w");
if (pf == NULL)
{
perror("fopen");
}
int ch = 'a';
while (ch<'z'+1)
{
fputc(ch, pf);
ch++;
}
fclose(pf);
pf = NULL;
return 0;
}
fputc()执行结果
执行读取代码fgetc()
// fgetc()
int main()
{
FILE * pf=fopen("date.txt", "r");
if (pf == NULL)
{
perror("fopen");
}
int c = 0;
while ((c=fgetc(pf)) != EOF)
{
printf("%c ", c);
}
fclose(pf);
pf = NULL;
return 0;
}
fgetc()执行结果
fgetc()、fputc()与fgets()、fputs()的区别
前者以字节为单位,后者以行为单位。
fwrite()与fread()
fwrite()
fread()
执行写入代码fwrite()
//fwrite
int main()
{
FILE* pfwrite = fopen("data.txt","wb");
if (pfwrite == NULL)
{
perror("fopen");
return 1;
}
char str[] = "This is a file!";
fwrite(str, 1, sizeof(str), pfwrite);
fclose(pfwrite);
pfwrite = NULL;
return 0;
}
fwrite()执行结果
执行读取代码fread()
//fread
int main()
{
FILE* pfread = fopen("data.txt", "rb");
if (pfread == NULL)
{
perror("fopen");
return 1;
}
char str1[20] = { 0 };
fread(str1, 1, 20, pfread);
printf("%s", str1);
fclose(pfread);
pfread = NULL;
return 0;
}
fread()执行结果
总结
注意 :不知道大家有没有注意到在上述代码书写中有几个问题。
第一,每次对文件进行的操作都与对文件的打开方式息息相关。要写入就是写方式,要读取就是读方式。
譬如在上述fread()函数的使用中,我将“rb”改为了“wb”,引发了以下后果:
显示屏没有打印出之前我们写入的内容,文件夹也被清空。
第二,每次打开文件,都会对文件指针判断是否为NULL;而每次关闭文件,都会释放文件指针。与之前我们学习解动态管理内存时的原理相同。
第三:对文件的操作步骤分为:打开文件、对文件进行操作(读写)、关闭文件。缺一不可。
最后,我们用一个简单的文件拷贝代码综合今天的内容。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
FILE* pfread = fopen("data1.txt", "r");
if (pfread == NULL)
{
perror("fopen data1");
return 1;
}
FILE* pfwrite = fopen("data2.txt", "w");
if (pfwrite == NULL)
{
perror("fopen data2");//如果frwrite打开失败
fclose(pfread);//则关闭pfread
pfread = NULL;
}
int ch = 0;
//下面是对文件内容进行拷贝的循环
while ((ch = fgetc(pfread)) != EOF)//fgetc()读取data1.txt的内容,遇到文件末尾,退出循环
{
fputc(ch, pfwrite);//fputc()将fgetc()读取的内容写入pfwrite指针
}
fclose(pfread);
pfread = NULL;
fclose(pfwrite);
pfwrite = NULL;
return 0;
}
大家自己运行一下,查看运行结果。
文件版本通讯录管理系统
如果需要程序结束后数据依旧保留的通讯录管理系统源码,可以私信我哦。