目录
一.c语言文件的概念
缓冲文件系统
文件型指针
二.打开文件和关闭文件
1.打开文件函数
2关闭文件
3.标准设备文件
三.文件的读和写
1.字符文件读写函数fgetc()和fputc();
2.数据块文件读写函数fread()和fwrite();
3.格式文件读写函数fscanf()和fprintf();
4.字符串文件读写函数fgets()和fputs().
文件(file)是指存储在外部介质(磁盘,磁带)上的,以唯一的名字作为标记的数据集合。
操作系统以文件为单位对数据进行管理。与主机相连的输入输出设备,其作用也是从设备上读取数据和将数据写到设备上,因此也把输入输出设备看作是文件。例如,键盘是一种输入文件,显示屏是输出文件。
文件的操作主要有二:文件的读操作和文件的写操作。文件的读:从文件中取出数据存入内存变量中;文件的写:将内存变量中存放的数据存放到文件中。
文件数据的存储一般有两种形式:1是以ASCII码的形式按字节存储的(叫做文本文件);2是以在内存中的二进制数形式存储的文件(二进制文件)。
二进制文件存储的数据一般要比文本文件的存储紧凑,占用内存少。读写数据时由于没有格式的转换,因而速度较快。而文本格式存储的数据可以直接输入输出,用户可以直接阅读文件内容。
缓冲文件系统是指在进行文件的读和写操作时,系统自动为每个打开的文件开辟一个内存缓冲去。数据的输入输出都是通过缓冲区去进行。
这个结构类型是系统定义的,并通过typedef将该结构体起名为FILE。FILE结构型定义在stdio.h文件中。定义如下
typedef struct
{
int _fid;
int _cleft;
int _mode;
char *nextc;
char *buff;
}FILE;
程序使用文件首先必须定义一个FILE型结构的指针变量。指向FILE结构性的指针称为文件型指针。例如 程序要同时要操作两个文件
FILE *p,*q;
两个文件的输入输出操作将通过相应的文件指针进行。
打开文件函数fopen()格式:
FILE *fopen(char *filename,char *mode)
filename 是字符型指针,它指向的字符串是要打开的文件名;mode指向文件的使用方式,即打开模式。
文件的使用方式字符串共有12个,6个用于文本文件,6个用于二进制文件。
功能 | |
r | 打开一个已存在的文本文件,只能用于从文件向计算机输入数据(读文件),不能向该文件输出数据(写文件)。 |
w | 打开一个文本文件,只能写入(输出)数据 |
a | 打开一个文本文件,在文件尾追加数据 |
w+ | 打开一个文本文件,可读可写 |
a+ | 打开已存在文本文件,可读,也可向文件尾写数据 |
rb | 打开已存在二进制文件,只读 |
wb | 打开一个二进制文件,只写 |
ab | 打开已存在二进制文件,文件尾写 |
rb+ | 打开已存在二进制,可读可写 |
wb+ | 打开一个二进制文件,可读可写 |
ab+ | 打开已存在二进制文件,可读,也可向文件尾加 |
r+ | 打开一个已存在的文本文件,可读可写 |
例如:if((fp=fopen("myfile","r"))==NULL)以"r"模式打开文件"myfile",文件型指针fp接收函数fopen的返回值,并判断文件是否成功打开。
int fclose(FILE *fp)
例子:打开关闭文件的使用
下面的程序将二进制文件data.dat以写方式打开,然后关闭该文件。
#include
int main()
{
FiLE *fp; /*定义文件型指针变量*/
if((fp=fopen("data.dat","wb"))==NULL)/*打开文件并判断文件是否正确打开*/
{
printf("file can't open\n");
exit(1);
}
fclose(fp); /*关闭打开的文件*/
}
标准输入设备为键盘,标准输出设备为显示器。
成功打开文件后就可以,就可以对文件进行读和写了。c语言提供了四组文件读写函数:
1
(1)写字符文件函数fputc()
int fputc(char ch,File *fp)
其中参数fp为文件指针,它的值是执行函数fopen()打开文件时获得的。ch为字符变量,其值即为所要写进文件的字符。
(2)读字符文件函数fgetc()
int fgetc(File *fp)
函数功能:从fp所指向的文件当前读指针位置读取一个字符。
2
(1)写字符串文件函数fputs()
char fputs(char *str,File *fp)
函数功能:将参数str指向的字符串(舍掉结束标记"\0")写入fp所指向的文件。文件内部指针自动后移一个字符串的位置。
(2)读字符串文件函数fgets()
char *fgets(char *str,int length, File *fp)
函数功能:从fp所指文件当前位置读取(length -1)个字符,在其后加上一个字符串结束标记"\0",组成字符串,存入str指定的内存区。
3
(1)数据块文件写函数fwrite()
unsigned fwrite(void *buffer, unsigned num_bytes, unsigned count, File *fp)
其中参数buffer是指向将要写到文件中的数据块指针,可以是存放数据的变量地址或数组首地址。num_bytes是无符号整型,可以是常量、变量或表达式。它是写入文件的每个数据所占用的字节数。
函数功能:将buffer所指向的count个数据(每个数据num_bytes字节)写入fp指向的文件。
(2)数据块文件读写函数fread()
unsigned fread(void *buffer, unsigned num_bytes, unsingned count,File *fp)
函数功能:从fp所知的文件的当前位置读取count 个数据,每个数据的字节数为num_bytes,存入buffer指定的内存区。
4
(1)格式化写函数fprintf()
int fprintf(File *fp,char *control_string,e1,e1,````,en)
参数fp是文件型指针;control_string是存放格式字符串的字符常量,或者是存放格式字符串的数组首地址,或者是指向格式字符串的指针变量;e1,e2,en是与格式字符串匹配的变量地址或数组首地址。
计算各表达式e1,e2,en的值,按照control_string指定的格式,写入fp所指向的文件。
(2)格式化读函数fscanf()
int fscanf( File *fp, char *control_string,e1,e2,en)
函数功能:从fp所指向的文件中,按照control_string规定的格式,读取n个数据,依次存入e1,e2,en地址中。
例如:从键盘输入三个数据(字符串,浮点数和整数)然后,将它们存入磁盘文件data.
#include
main()
{
FILE *fp; //定义文件指针
char str[10];
float fval;
int k;
if((fp=fopen("data","w"))==NULL) //打开文件
{
printf("cannot open file");
return 0;
}
printf("输入字符串、浮点型、整型:");
fscanf(stdin,"%s%g%d",&str,&fval,&k); //从键盘读取数据
fprintf(fp,"%s %g %d",str,fval,k); //将数据写入文件
fclose(fp);
return 0;
}