目录
1.为什么使用文件
2.什么是文件
2.1 程序文件
2.2 数据文件
2.3 二者的关系
2.4 文件名
3.文件的打开和关闭
3.1文件指针
3.2 文件的打开与关闭
4.文件的顺序读写
只写模式
单个字符输出(fputc)
整行的输出(fputs)
只读模式
拷贝文件
文件的功能是储存数据
既然内存也能储存信息,为什么要使用文件
存在即合理,文件的存在能让我们的信息持久化,也就是说,即使一个程序的结束,只要储存的信息已经保存,下次依然可以访问到这些信息
就比如说通讯录,每储存一个人,都需要放在文件里保存,不然信息就会丢失
储存在磁盘中的文件就是文件
在程序设计中,根据文件的功能,常说的文件包括程序文件和数据文件
源程序文件(后缀为.c)
目标文件(在windows环境后缀为.obj)
可执行文件(后缀为.exe)
文件的内容不仅仅只有程序
可能是程序要从中读取的数据、或者输出内容的文件
当然文件的后缀并不能就说明这是说明类型的文件
同样都是.c为后缀的文件,也可能是数据文件
功能决定文件类型
一个文件要有一个唯一的文件标识以便识别和引用,分别为
1.路径(用来找到文件)
2.主干名(识别是什么)
3.后缀(文件的格式或属性)例如c:\code\test.txt
一般情况下,文件标识就是文件名
知道文件的功能后,具体怎样通过程序来访问文件的呢
打开文件,并对文件的内容进行修改,离不开文件指针
文件指针也称为文件类型指针
文件一旦创建,就会在内存里形成一个文件信息区,这个文件信息区以结构体的形式储存在内存中,这个结构体的用来存放文件的相关信息,例如文件的名字,文件状态以及当前的位置。
该结构体类型由系统声明的,取名为FILE。
不同编译器文件信息区的内容不相同,但是都是大同小异的
访问文件,就需要打开文件和关闭文件
分别用到fopen和fclose库函数,其中fopen可以选择多种功能进行打开,也就是说,随着访问需求不同,就需要不同的打开模式(mode)。
模式的概要如下:
只读模式:只从文件输入
只写模式:只向文件输出
更新模式:对文件进行输入和输出
追加模式:从文件末尾处开始向文件输出
fopen |
头文件 #include |
格式 FILE *fopen(const char *filename,const char *mode) |
r 以只读模式打开一个已存在的文本文件,如果文件不存在,会出错。 w 以只写模式生成文本文件,若文件存在则文件长度清为Q②. a 以追加模式,也就是从文件末尾处开始的只写模式,打开或生成文本文件。 打开方式 rb 以只读模式打开二进制文件。 wb以只写模式生成二进制文件,若文件存在则文件长度清为0. ab 以追加模式,也就是从文件末尾处开始的只写模式,打开或生成二进制文件。 r+ 以更新(读写)模式打开文本文件。 w+以更新模式生成文本文件,若文件存在则文件长度清为0. a+以追加模式,也就是从文件末尾处开始写入的更新模式,打开或生成文本文件。 |
返回值 返回一个指向对象的指针,该对象用于控制已打开的流。若打开操作失败,则返回空指针 |
这里的“流”,是一个宏观概念,通过连接键盘,显示器等周边机器形成的 “字符流通的管道”
fclose |
头文件 #include |
格式 int fclose(FILE *stream); |
功能 刷新stream指向的流,关闭与该流相连的文件。流中只进行了缓冲操作,还未被写入的数据 会被传递到主机环境,由主机环境把这些数据写入文件中,而缓冲区里面尚未被读取的数据 会被丢弃。然后把该流与文件分离,如果存在系统自动分配的与该流相连接的缓冲区,则会 释放该缓冲区。 |
返回值 成功关闭流时返回0,检测出错误时则返回EOF |
//以只读模式访问文件
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
//打开文件
FILE* fp = fopen("text.txt","r");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));//打印出错误原因
return 0;
}
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
当利用只读模式(r)访问文件时
如果文件不存在,就会返回错误,这里用strerror打印出错误原因
不存在text文件时
当利用只写模式(w)访问文件时
如果文件不存在,就会自动创造一个文件(text)
fputc |
头文件 #include |
格式 int fputc(int C, FILE *stream); |
功能 将c指定的字符转换成unsigned char 型并写入 stream 指向的输出流 |
返回值 返回写入的字符,若发生写入错误,则对流设置错误指示符并返回 EOF |
//从内存中输出到文件流中
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
//打开文件
FILE* fp = fopen("text.txt","w");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//写文件,从内存中输出到文件中
int i = 0;
for (i = 'a'; i <= 'z'; i++)
{
fputc(i,fp);
}
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
当C语言程序运行起来,就会默认打开三种流:
标准输入流:stdin
标准输出流:stdout
标准错误流 :stderr
从键盘上输入内存时,就是将数据输入到标准输入流
从内存上输入显示器上时,就是将数据输入到标准输出流
而fgetc适用于所有的输入流
所以fgetc既可以通过文件输出流到磁盘中的文件上,也可以通过标准输出流打印到显示屏上
只需要将 fputc(i,fp)改成fputs(i,fp)。
fputs |
头文件 #include |
格式 int fputs(const char *s, FILE *stream); |
功能 把参数s指向的字符串写入stream指向的流,但不包括字符串末尾的空字符 |
返回值 若发生写入错误则返回EOF,否则返回非负值 |
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
//打开文件
FILE* fp = fopen("text.txt","w");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
fputs("abcdef",fp );
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
单个字符的输入 (fgetc)
fgetc |
头文件 #include |
格式 int fgetc(FILE *stream); |
功能 从stream指向的输入流中读取 unsigned char 型的下一个字符的值 |
返回值 返回EOF.发生读取错误时,则对该流设置错误指示符并返回 EOF |
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
//打开文件
FILE* fp = fopen("text.txt", "r");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//读文件
int ch;
while ((ch=fgetc(fp))!=EOF)
{
printf("%c ", ch);
}
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
整行的输入(fgets)
fgets |
头文件 #include |
格式 char * fgets(char * s, int n,FILE *stream); |
功能 从stream指向的输入流中读取 unsigned char 型的字符串 |
返回值 函数获取字符串放入数组a,返回该数组的指针(首地址)如果读完,则返回空指针NULL |
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
//打开文件
FILE* fp = fopen("text.txt", "r");
//判断是否成功打开
if (fp == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
//读文件
char ch[3];
fgets(ch,3,fp);
printf("%s", ch);
//关闭文件
fclose(fp);
fp = NULL;
return 0;
}
这里的fgets的第二个参数就是决定读取多少个字符,读取的字符数就是对应的数字减一;
#include
#include
int main()//拷贝文件
{
FILE* pr = fopen("text.txt", "r");
if (pr == NULL)
{
printf("open for read:%s\n", strerror(errno));
return 0;
}
FILE* pw = fopen("text2.txt","w");
if (pr == NULL)
{
printf("open for write:%s\n", strerror(errno));
close(pr);
pr = NULL;
return 0;
}
int ch=0;
//拷贝文件
while ((ch=fgetc(pr)) != EOF)
{
fputc(ch, pw);
}
//关闭文件
fclose(pr);
pr == NULL;
fclose(pw);
pw == NULL;
return 0;
}
此时拷贝的text2与text完全相同
欢迎点赞收藏加关注,如若有问题可以提出来