文件基础
概述
读/写 | 指定格式 | 以字符为单位 |
---|---|---|
从文件读入 | fscanf(文件指针,格式字符串,输入表列); | int fgetc(FILE *fp); |
写到文件中 | fprintf(文件指针,格式字符串,输出表列); | int fputc(int ch,FILE *fp); |
概念:指存储在外部介质上的数据的集合。
注:数据和程序都以文件的形式存放在外部介质上。操作系统以文件为单位对数据进行管理。
文件名:路径+主名+扩展名
文件分类:
按文件类别:普通文件(文本文件、程序文件等)、设备文件(显示器、音响等)...
按存储介质:磁盘文件(存储在磁盘中的文件)、光盘文件(存储在光盘中的文件)、u盘文件(存储在U盘中的文件)...
按用途:程序文件(组成程序的文件)、数据文件(存储数据的文件)...
按文件中数据的组织形式:ASCII文件(以ASCII表示的文件,例如:.txt、.cpp、.c等以字符组成的文件)、二进制文件(用二进制形式表示的文件,可以是.o、.exe等程序文件,也可以是特定格式的数据文件如.mp3等)...
文件读写示意图:
文件系统:
标准文件系统:采用缓冲文件系统,系统自动为正在使用的文件开辟内存缓冲区。
特点:为每个数据流开辟一个内存缓冲区,缓存区用于存放流中的数据,缓存区中的数据就是流。
非标准文件系统:不使用缓冲区的文件系统,由程序设计者在程序中为每个文件设定缓冲区。
代码示例:
#include <stdio.h>
#include <stdlib.h>
/*这个程序用来测试输入缓存区*/
int main()
{
int n[5],i;
for(i=0;i<5;i++)
{
scanf("%d",&n[i]);
printf("%d\n",n[i]);
}
return 0;
}
结果:
解析:
如上,一次性输入1到5的数字,都被存入了输入缓存区。在程序运行过程中从输入缓存区中逐个读取出来,并输出。
文件结构及打开关闭文件
文件结构
定义:内存会为每个使用中的文件开辟一段区域用于存放其信息。而文件的信息将作为一个结构体被保存在内存中。
C语言中的文件结构体:
为了方面对文件进行操作,C语言在stdio.h头文件中已经定义好了文件的结构体。
其具体代码如下:
typedef struct _iobuf
{
char* _ptr;//指向buffer中第一个未读的字节(buffer即缓存区)
int _cnt;//记录剩余未读字节的个数
char* _base;//记录该文件的缓存区的地址
int _flag;//记录打开的文件的一些属性值
int _file;//用于获取文件的描述
int _charbuf;//单字节的缓冲
int _bufsiz;//缓冲区的大小
char* _tmpfname;//由系统访问的临时文件名
}FILE;
只要在程序中调用了stdio.h头文件,就可以直接使用该自定义类型来方面的操作文件。
如:
FILE *fp;
以上代码段即定义一个指向FILE类型的指针,该指针也被称为“文件指针”。使用这种指针,可以配合C语言中的各种文件操作函数方面快捷的对文件进行操作。打开文件
定义:为文件流对象和指定的磁盘文件建立关联,并指定文件的工作方式(只读、只写、追加等)
方式:FILE *fp = fopen("文件地址","打开方式");
注1:以上fopen函数为C语言中打开一个磁盘文件的函数。其中文件地址的格式为:"file.txt"或"c:\\dict\\dictionary.dat".前者只写文件名,则默认文件和程序在同一目录下。后者加上了地址,则文件在指出的地址目录下。
注2:以上打开方式除常用的只读只写追加外还有多种,其中的区分将在以下解析。
方式 | 文件类型和操作要求 |
---|---|
r | 只读打开一个文本文件,只允许读数据 |
w | 只写打开或建立一个文本文件,只允许写数据 |
a | 追加打开一个文本文件,并在文件末尾写数据 |
rb | 只读打开一个二进制文件,只允许读数据 |
wb | 只写打开或建立一个二进制文件,只允许写数据 |
ab | 追加打开一个二进制文件,并在文件末尾写数据 |
r+ | 读写打开一个文本文件,允许读写 |
w+ | 读写打开或建立一个文本文件,允许读写 |
a+ | 读写打开一个文本文件,允许读,或在文件末尾追加数据 |
rb+ | 读写打开一个二进制文件,允许读和写 |
wb+ | 读写打开或建立一个二进制文件,允许读和写 |
ab+ | 读写打开一个二进制文件,允许读,或在文件末尾追加数据 |
注3:以上r+和w+的区别在于,当文件不存在时,r+方式会打开失败,而w+方式会新建一个文件。
注4:以上b(banary)代表二进制文件,而t(text)代表文本文件。因t是默认的。所以rt写为r。
注5:使用fopen打开文件时,当使用r方式且文件不存在。或使用w方式且磁盘损坏无法建立新文件时,打开文件会失败。此时需要对此进行异常处理。如:
if(fp=fopen("file.txt","w")==NULL)
{
printf("error!cannot open file.txt!\n");
exit(1);
}
关闭文件
定义:当对文件的操作完成时,需要关闭文件,将缓冲区中的数据妥善处理,解除磁盘文件与文件流的关联,不再通过文件流对该文件进行输入或输出。
方式:fclose(文件指针);
如:
int main()
{
int a[10];
FILE *fp;
fp=fopen("file.txt","w");