文件
1C语言中的文件
- 程序文件
- 源文件
- 目标文件
- 可执行文件
- 数据文件
- 文本文件,ASCII字符形式,可以对字节里的二进制进行编码,方便人的理解
- 二进制文件,机器直接用的文件
2文件缓冲区
- ANSIC 标准采用“缓冲文件系统”处理的数据文件的
- 所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在 使用的文件开辟一块“文件缓冲区”。
- 从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘 上。
- CPU处理和IO读写之间,有速度差异,不然,CPU就会等待【浪费】
- 从CPU到文件的两个方向:CPU读,CPU写
- 文件,本质上是磁盘上的数据,即外围设备中的数据
- 缓冲区思想 == 缓冲带 == 缓冲池
- 类似的应用:打印机缓冲,
- 目的:利用中间地带,缓解速度矛盾,提高资源利用率
- 如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐 个地将数据送到程序数据区(程序变量等)。
- 缓冲区的大小根据C编译系统决定的(看不懂再看下面)
- 这就相当于你嗑瓜子,垃圾桶离你很远【必须的,如办公室里不能放这个桶,你又在办公室里】的时候,你难道要吃一个跑过去扔一个吗?那么我们就是嗑一把瓜子后,把瓜子皮一次送往垃圾桶,而文件缓冲区就相当于你聚瓜子皮的地方;
- 【某个位置】,即聚皮的地方,即缓冲区
- CPU写数据时,把数据先组织好,放在内存【某个位置】中,等到满时或是完时,内存一次写到硬盘中。
- CPU读数据时,把数据从磁盘读入,先组织好存放在内存【某个位置】中,等到满时或是完时,CPU一次读入
- 从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘 上。
- 所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在 使用的文件开辟一块“文件缓冲区”。
3基本过程
3.1常见操作
- 打开 fopen
- 操作 write/read
- 关闭 fclose
// 0 文件指针准备
FILE* fp;
// 1 打开文件
FILE * fopen ( const char * filename, const char * mode );
FILE* fp=fopen("e:/text.txt","r");
// 2 处理
// n 关闭文件
int fclose ( FILE * stream );
fclose(fp);
3.2对fopen的补充说明
1.如果文件打开成功,fopen()函数将返回给文件的文件指针,以后就可以通过该文件指针来对文件进行各种操作,而不用再使用文件名。
2.如果文件打开失败,fopen()函数返回空指针NULL.
3.可以通过判断fopen()函数的返回值来确定文件是否正常打开
if(fp=fopen("filename","r")==NULL)
{
printf("Can not open this file!\n");
exit(0);
}
3.3文件的关闭
- 使用完文件后应及时地对文件进行关闭,及时关闭文件的理由至少有以下两点:
- 使用缓冲文件系统时,如果数据缓冲区未满而又不关闭文件就退出程序的运行,则会造成数据缓冲区内的数据丢失。
- 一个系统内能够同时打开的文件有一定的数量限制。如果不及时地关闭已经不使用的文件,就可能造成打开其他文件时出错。
函数原型:int fclose( FILE *stream );
调用形式:fclose(文件指针);
函数功能:将与指定文件指针相关联的文件关闭。
fclose函数正常关闭了文件,返回0,否则返回EOF(-1)。
说明:
1.该函数用于关闭使用fopen()函数打开的文件,一般程序在这之前打开了几个文件,就必须调用fclose()关闭几个文件。
2.标准设备文件stdin、stdout和stderr由系统自动打开,系统会自动关闭。
3.函数正常关闭文件后返回值为0,出错则返回符号常量EOF(值为-1)。
4.若文件关闭后又想再次对这个文件进行操作,需要再一次使用fopen()函数打开文件。
3.4文件尾检测
- 程序中需要判断文件是否处理完成,即文件内部记录指针是否已移动到了文件尾标志处。
- EOF(仅用于文本文件)
- 由于文本文件中任何字符的编码均不是-1,可以用-1表示文本文件的文件尾标志,系统中用符号常量EOF来表示。在输入流中表示为ctrl+z。
- feof(pf)
- ANSI C提供了一个测试文件状态的函数feof(pf),当文件未结束时feof函数的值为0,否则为非0值。
- 使用函数feof来判断文件是否结束既可用于文本文件,还可用于二进制文件。
- 这个方法,会多读一次文件。
4对单个文件的操作方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQfodMW4-1607311260680)(20201130-C语言-文件.assets/image-20201130121624645.png)]**
4.1单字符输入函数fgetc
- 函数原型:int fgetc(FILE *stream );
- 函数调用:ch=fgetc(fpt); //注意,ftp和ch分别为已经定义的文件指针变量和字符变量
- 函数功能:从指针变量fpt相关联的文件中读取一个字符并将其赋给字符型变量ch;执行函数时遇文件结束符或在执行中出错时返回值为EOF(-1)。
示例:
-
功能:从键盘输入一个文本文件的名称,并将其内容显示在屏幕上。
-
解释:
- 1.文件名一般啊包含为多个字符的字符串,可以定义一个字符数组filename进行存放。
- 2.要从文件中读取内容,fopen()函数的打开方式可设置为“r".
- 3.文件打开后可以使用fgetc()函数一个一个的读取字符,然后使用putchar将读到的字符显示到屏幕上,知道文件读完为止。
- 4.由于fgetc()函数遇到文件尾时返回EOF,因此可构建一个while循环判断文件是否读完。
程序代码如下:
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE *fp;
char ch, filename[50];
printf("请输入文件名:");
gets(filename);
if ((fp=fopen(filename, "r")) == NULL) //打开文件
{
printf("打开文件失败!\n");
exit(0);
}
while ((ch = fgetc(fp)) != EOF) //检测文件读取是否达到尾部
putchar(ch); //输出到屏幕上
fclose(fp); //关闭文件
system("pause");
字符读取函数fgetc()可从文件数据流中一次读取一个字符,然后读取光标移动到下一个字符,并逐步将文件的内容读出。如果字符读取成功,则返回所读取的字符,否则返回EOF(end of file)。EOF是表示数据结尾的常量,真值为-1。另外,要判断文件是否读取完毕,可利用feof()进行检查。未完返回0,已完返回非零值。