一文搞懂C语言的文件操作
本文参考:浙大版《C语言程序设计(第4版)》
- 什么是文件操作
- 怎么实现基础文件操作
- 其它文件操作
一、什么是文件操作?
直接来看不太方便理解,我们把它分开。
文件
文件可以通过应用程序创建,如运行“记事本”程序,输入一些数据,然后保存并输入文件名,就会在磁盘中产生一个文本文件。
刚刚我们创建的只是一种文件,叫做文本文件,还有好多其它类型的文件,每个文件都有自己的属性。
文件的概念
在操作系统中,文件是指驻留在外部介质(如磁盘等)中的一个有序数据集
它可以是源文件、目标程序文件、可执行程序,也可以是待输入的原始数据,或是一组输出的结果。
文件的分类
源文件、目标文件和可执行程序可称为程序文件,输入输出数据可称为数据文件。数据文件还可分为各种类型,如文本文件、图像文件、声音文件等。使用应用程序时,通常保存功能实现把数据从内存写入到文件,这就是所谓的(存盘),打开功能实现把磁盘文件的内容读入到内存。
我们需要重点关注的类型就是数据文件
最直观的例子也就是记事本(可编辑的文本文档)
操作
我们需要了解的就是读和写两个操作,简单来说
读:scanf做的事情
写:printf做的事情
当上升到文件层面时,“读”就不再是我们平时那样,从键盘读入,而是从数据文件中(最常见的就是记事本)读入;“写”也就是输出,同样地,不会像我们之前写程序那样,显示在屏幕上,而是写在数据文件中(最常见的也是记事本)
那为什么需要文件操作这种东西呢?
有的人想问,这不是找麻烦吗?我直接ctrl + c / v,运行一下,结果显示在屏幕上,这不是很方便吗?整到记事本里面干什么。
其实,文件操作主要是运用于大量数据输入时,可能复制粘贴都得好几秒的那种,屏幕也放不下,那么这个时候用文件操作就很方便啦。
二、怎么实现文件操作?
直接上代码,用注释帮助理解。
具体细节不表
FILE *fp1, *fp2, *fp3;
fp1 = fopen("in.txt", "r");//读
fp2 = fopen("out.txt", "w");//写
/这里进行你的程序读写/
(读入类型一)
fscanf(fp1, "%d%lf", &n, &ft);
fprintf(fp2, "%d%f", n, ft);
(读入类型二)
ch = fgetc(fp1);
fputc(ch, fp2);
(读入类型三)
fgets(s, len, fp1);
fputs(s, fp2);
(关闭文件)
fclose(fp1);
fclose(fp2);
fp3 = fopen("out.txt", "a");//追加
fprintf(fp3, "需要补充在后面的东西****");
(关闭文件)
fclost(fp3);
以上就是就是常用的用法,我们接下来从以下几个方面来读懂这个程序
- FILE
- fopen和fclose
- fscanf和fprintf
- fgetc和fputc
- fgets和fputs
1.FILE
简单来写,就是下面这样的(不必搞懂里面的细节)
typedef struct {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(即是文件的起始位置)
int _flag; //文件标志
int _file; //文件描述符id
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件缓冲区大小
char *_tmpfname; //临时文件名
}FILE;
所以我们知道,FILE是一个结构体类型,我们定义时
FILE * fp;
其实是定义了一个结构体指针,我们对这个文件指针进行操作时,本质上就对文件进行了操作。
2.fopen和fclose
fopen(“文件名”,文件打开方式);
例如:fp = fopen(“in.txt”, “r”);
说明:(1)该函数有返回值。如果执行成功,函数将返回包含文件缓冲区等信息的FILE结构地址,赋给文件指针fp。否则,返回一个NULL(空值)的FILE指针。
(2)括号内包括两个参数:“文件名”和“文件打开方式”。两个参数都是字符串。“文件名”指出要对哪个具体文件进行操作,一般要指定文件的路径,如果不写出路径,则默认与应用程序的当前路径相同。
我们只讲解了前三种,大家可以借助于此继续理解其它的方式,我们在此就不多赘述。
不过重点还是放在文本文件(左边一栏),二进制文件用到的情况很少。
fclose(文件指针);.
例如:fclose(fp);
说明:fclose的作用就是关闭文件,至于为什么,我们在前面的介绍中也提到过,如果不及时关闭,可能会出现数据保存不成功的问题。
此外,你需要知道:C语言允许一个程序同时打开多个文件,但是不允许同一文件在关闭前被打开,也就是说,你这一次不关,很有可能导致以后再用这个文件时,就打不开。
3.fscanf和fprintf
fscanf(文件指针,格式字符串,输入表);
fprintf(文件指针,格式字符串,输出表);
例如:
fscanf(fp1, “%d%lf”, &n, &ft);
fprintf(fp2, “%d%f”, n, ft);
说明:其实和scanf和printf差不多,多了一个参数是文件指针。
4.fgetc和fputc
fgetc(文件指针);(返回一个字符);fputc(字符,文件指针);
例如:
ch = fgetc(fp1);
fputc(ch, fp2);
说明:其实和getchar()和putchar()差不多,多了一个参数是文件指针。
5.fgets和fputs
fgets(字符串首地址,想要读入的字符串长度,文件指针);fputs(字符串首地址, 文件指针);
例如:
fgets(s, len, fp1);
fputs(s, fp2);
说明 :fgets()比gets()多了两个参数,一个是文件指针,一个是想要读入的长度,意思就是你想读进去几个字符存到字符串里,可以用变量来控制.
fputs()比puts()也就多了一个参数——文件指针。
三、其它的文件操作(摘自教材)