文件名称:13.第十三章 文件.txt
文件大小:21KB
文件格式:TXT
更新时间:2022-11-28 10:20:07
文件
第十三章 文件
对数据的管理无论是用数组还是链表,都是存储在内存中的,程序结束后都会丢失,下一次运行程序时,要重新输入或运算生成数据。要把程序运行的数据保存起来以便下次运行继续使用,在计算机中持久保存数据的方式是利用文件保存。
13.1 文件概述
文件一般是指存储在外部介质上数据的集合。文件以数据形式存放在外部介质上,操作系统以文件为单位对数据进行管理。想找到存在外部介质上的数据,必须按文件名找到指定的文件然后再从该文件中读取数据。要想在外部介质上存储数据必须先建立一个文件(以文件名标识),才能向它输出数据。从操作系统角度,每一个与主机相连的输入输出设备都可以被看作一个文件。在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上保存,以后要用时再从磁盘中输入到计算机的内存,这就要用到磁盘文件。
操作系统的文件标识包括三部分:
(1)文件路径:表示文件在外部存储设备中的位置。
(2)文件名:遵循标识符的命名规则。
(3)文件扩展名:表示文件的性质(.txt .dat .c)。
如:d:\c++\temp\flie1.dat
文件操作是一种典型的IO操作(输入输出操作)。输入输出是针对内存而言的,进内存为输入,出内存为输出。
标准输入输出就是标准输入设备(键盘)和标准输出设备(显示器),键盘和显示器就是一种文件。C语言将文件看成字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。C语言中对文件的存取是以字符(字节)为单位的,输入输出数据流的开始和结束仅受程序控制不受物理符号控制(如回车换行符)。输出时不会自动增加回车换行符作为记录结束的标志,输入时不以回车换行符作为记录的间隔(实际上C文件不是由记录构成的),这种文件称为流式文件。
ANSI新标准文件采用缓冲方式,系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。从内存向磁盘输出数据必先送到输出缓冲区,装满缓冲区后才一起送到磁盘。从磁盘向内存输入数据先送到输入缓冲区,程序需要数据时去缓冲区读取,若缓冲区无数据,则程序进入阻塞状态(等待数据)。
C语言把数据看作是一连串的字符(字节),根据数据的组成形式,分为ASCII文件和二进制文件。
文本文件又称ASCII文件,每个字节存放一个ASCII码,代表一个字符。如1、2的ASCII码分别为49、50,所以整数12用ASCII文件存放时,存放形式为00110001 00110010
二进制文件是直接用数据的二进制形式存放的,即把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。
程序中实现对文件的处理通常分三步:
(1)打开文件:将程序与文件建立联系。
(2)操作文件:对文件进行读写操作,即输入输出。
(3)关闭文件:操作完成应当切断文件与程序的联系。
C语言中没有输入输出语句,对文件的读写都是用库函数实现的。ANSI规定了标准输入输出函数,用它们对文件进行读写,这些函数的声明包含在头文件stdio.h中。
13.2 文件的打开与关闭
文件进行读写操作前先要打开,使用完毕要关闭。打开文件,是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其他操作。关闭文件则断开指针与文件之间的联系。
1.打开文件(fopen函数)
原型:FILE *fopen(char *filename, char *mode);
FILE是在stdio.h头文件中定义的一个结构体,用来保存文件信息。
fopen函数用来打开一个文件,其调用的一般形式为:
文件指针名=fopen(文件名,使用文件方式);
其中:
·“文件指针名”必须是被说明为FILE类型的指针变量。
·“文件名”是被打开文件的文件名,是字符串常量或字符串数组。
·“使用文件方式”是指文件的类型和操作要求。
如:
FILE *fp;
fp=fopen("file1.txt","r");
其意义是在当前目录下打开文件file1.txt,只允许读操作,并使fp指向该文件。
又如:
FILE *fp;
fp=fopen("c:\\file2.txt","rb");
意义是打开C驱动器磁盘根目录下的文件file2.txt,对其按二进制方式进行读操作。两个反斜线\\中的第一个表示转义字符,第二个表示根目录。
文件打开方式
r 只读打开一个文本文件,只允许读数据
w 只写打开或建立一个文本文件,只允许写数据
a 追加打开一个文本文件,并在文件末尾写数据
r+ 读写打开一个文本文件,允许读和写
w+ 读写打开或建立一个文本文件,允许读和写
a+ 读写打开一个文本文件,允许读和在文件末尾写数据
rb 只读打开一个二进制文件,只允许读数据
wb 只写打开或建立一个二进制文件,只允许写数据
ab 追加打开一个二进制文件,并在文件末尾写数据
rb+ 读写打开一个二进制文件,允许读和写
wb+ 读写打开或建立一个二进制文件,允许读和写
ab+ 读写打开一个二进制文件,允许读和在文件末尾写数据
(1)文件使用方式由r、w、a、b、+拼成,含义分别为:
r(read) 读
w(write) 写
a(append) 追加
b(binary)二进制文件
+ 读和写
(2)用r方式打开文件时文件必须存在,只能从该文件读出。
(3)用w方式打开只能向文件写入。若打开的文件不存在,则以指定的文件名建立新文件。若存在,则将存在的文件删除,重建新文件。
(4)向一个已存在的文件追加新的信息,只能用a方式打开。文件必须存在,否则会出错。
(5)打开文件出错时fopen将返回一个空指针值NULL。程序中可用这一信息判断是否完成打开文件的工作,并做相应的处理。因此常用以下程序段打开文件:
if((fp=fopen("c:\\file2.txt","rb"))==NULL)
{
printf("\nerror on open c:\\file2.txt!");
exit(0);
}
(6)把文本文件读入内存时,要将ASCII码转换成二进制码。把内存数据以文本方式写入磁盘时,要将二进制码转换成ASCII码。因此文本文件的读写花费较多的转换时间,对二进制文件的读写不存在这些转换。
(7)标准输入文件(键盘)、标准输出文件(显示器)、标准出错输出(出错信息)是由系统打开的,可直接使用。
2.关闭文件(fclose函数)
文件使用完毕,应用关闭文件函数把文件关闭,从而把缓冲区的数据写入文件中。否则程序结束时可能造成数据丢失。
fclose函数使用形式:
fclose(文件指针);
如:fclose(fp);
正常完成关闭文件操作时,fclose函数返回值0。发生错误时返回EOF。
13.3 文件读写
对文件的读和写是最常用的文件操作,在C语言标准库中提供了多种文件读写的函数。
字符读写函数:fgetc和fputc
字符串读写函数:fgets和fputs
数据块读写函数:fread和fwrite
格式化读写函数:fscanf和fprintf
13.3.1 字符读写函数
1.读字符函数fgetc
规格:int fgetc(FILE * stream);
功能:从指定的文件中读一个字符。
参数:stream为指向文件的指针。
返回值:从stream所指的文件流中读取一个字符,转换为int类型返回。若已到文件尾返回EOF,文件状态改为结束状态。若读错误返回EOF,文件改为错误状态。EOF在stdio.h中定义为-1。
例如:
ch=fgetc(fp);
其含义是从打开的文件fp中读取一个字符并送入ch中。
对于fgetc函数的使用有几点说明:
(1)在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。
(2)文件内部有一个位置指针,用来指向文件的当前读写字节,文件打开时,位置指针总指向文件的第一个字节。使用fgetc函数后位置指针向后移动一个字节。因此可连续多次使用fgetc函数读取多个字符。文件指针是指向整个文件的,要在程序中定义说明,只要不重新赋值文件指针值不变。文件内部的位置指针用于指示文件内部的当前读写位置,每读写一次,位置指针向后移动,它无需在程序中定义说明,由系统自动设置。
例:读取文本文件file.txt,把其中所有非空格字符输出在标准输出设备上。
#include