文件
1. 概述
在一个C语言程序中,除了自行编写程序之外,我们还想到应该如何对计算机内依然存在的文件进行操作,这就引出了本文的主题。
内存与外存
要描述文件,首先需要从内存,外存两个概念说起。
内存的概念,此前曾多次提及,是各类变量,算法储存的位置,并会在程序运行结束后及时释放。
内存中的数据会在关机后立刻消失。
如果对DIY有一定了解,则会常常听到“内存条”,就是这东西。
外存则是永久存放各类文件,数据的地方,其中的数据在关机后不会消失。
同样的,接触到的固态硬盘,机械硬盘,以及延伸至各类u盘,软盘,都属于外存的范畴。
文件
文件 是数据的集合,也是操作系统储存数据的基本方法。
文件有以下基本属性:
- 文件名
- 占用空间
- 存储位置
- 文件类型
- 读写属性
- 创建,访问,修改时间
- ….
操作系统为了使各种各样的文件有序的存储,衍生出了 目录 这一概念(即文件夹)
要通过程序操作文件,就必须要求相应的高级语言具有相应的文件操纵能力。
我们要达到的目的就是通过C语言程序访问文件,即对文件进行相关的输入(input),输出(output)操作。
为了简化书写,对输入输出,下文中简称为(I/O)
C语言中的文件形式
C语言将文件看成一个二进制流或字符流:
- 二进制流(常用于二进制文件):
相当于把文件看成很多0/1序列,这种方式更有利于计算机的信息读取,保存,写入,但不利于阅读。 - 字符流(常用于文本文件):
将文件看成很多字符序列的组合,每行后有一个换行符。这种形式很适合I/O操作。
与此同时,C语言在其标准库中加入了相应函数,包括:
- 打开文件
- 关闭文件
- 读写文件
2. 文件的打开与关闭
文件的打开
在C语言中打开文件常用 fopen 函数:
FILE *fp //定义文件类型指针
fp=fopen("这里写你的文件名(别忘加后缀)", "这里写打开方式");
if(fp==NULL){
//这里处理无法打开的情况
}
几个注意事项:
- 如果打开文件成功,则返回一个FILE类型的指针地址,并且此后的文件操作都通过这个指针进行。
如果打开失败,则返回空指针。
因此利用C语言打开文件后一定要检查是否打开成功。 - c语言有很多种文件打开方式:
- “r”: 打开文本文件,只读
- “w”: 新建文本文件(或者删除原本的内容),只写
- “a”: 打开文本文件,追加
- “r+”: 打开文本文件,可以读+写
- “w+”: 新建文本文件(删除原来的内容),可以读+写
- “a+”: 打开文本文件,可以读+追加
- 如果用二进制模式打开文件则在打开方式后加b,即:”rb”,”ab+”等。
文件的关闭
在C语言中关闭文件常用 fclose 函数:
fclose(fp);
几点注意事项:
- 对于执行写入操作的文件,会将缓冲区内的内容写入文件中,然后关闭文件。
- 对于只读文件,会丢弃缓冲区内的内容,然后关闭文件
- 程序退出时,所有文件会自动关闭
三个标准文件指针
C语言中,有三个自动生成的标准文件指针:
- stdin(标准输入流)
- stdout(标准输出流)
- stderr(标准错误流)
stdin一般与键盘相连接,stdout一般与显示器相连接。
3. 文件的操作
文件的读写涉及到多个函数,这其中还包括顺序读写与随机读写两种类型。
文件的顺序读写
字符读写函数:fgetc & fputc
首先对fgetc函数进行说明。
char c;
FILE *p
p=fopen("myfile.txt", "r"); //通过只读模式打开一个文件
c=fgetc(p); //从文件指针的位置读取一个字符
几点说明:
- fgetc函数只能对以”r”(只读), “r+”(只读写)的文件进行操作。
- fgetc函数通过文件内部的位置指针进行读取。
- 每次读取一个字符,则文件指针fp向后移动一个位置。若读取失败(如读取到最后一个字符时),则返回EOF。
注:在应用时,可以利用这个特性进行循环读入:while((c=fgetc(p))!=EOF){ printf("%c", c); } //通过这种方式实现对文件的整体输出。
此后是fputc函数。
char c;
FILE *p;
fputc(ch, p); //在p所指向的位置写入一个字符
几点说明:
- 被fput操作的文件只能是通过”w”, “w+”, “a”所打开的文件。
- 每写入一个字符,则字符指针fp向后移动一个位置。若写入失败,返回EOF。
字符串读写函数:fgets & fputs
先对fgets进行说明
char str[n]; //这里权且为了说明写了n,正常情况下这种写法不合规
FILE *p;
...... //省略文件打开的过程
fgets(str, n, fp); //在fp的位置读取n-1个字符,并将其放入str中
几点说明:
- fgets函数如果遇到了换行符或EOF,则自动结束读取。
- fgets函数的返回值为字符数组的首地址。
- 若读取失败,则返回NULL。
在对fputs进行说明
char str[n];
FILE *p;
......
fputs(str, p); //在p的位置将str送入文件
该函数执行成功则返回0,否则则返回EOF。
格式化读写函数:fscanf & fprintf
从名字就能看出来,这两个函数与scanf以及printf的功能及其类似,区别在于这两个函数的操作对象是文件,而scanf,printf的操作对象为键盘。(标准输入设备)
...... //省略文件打开过程
fscanf(fp, "%d", &a); //将文件中的数据读取并存储在变量中
fprintf(fp, "%s", str); //将变量中的数据写入到文件中
数据块读写函数 fread & fwrite
fread与fwrite常用于二进制文件。
fread(fa, 4, 5, fp); //从fp的位置开始每次读4个字节,读5次,并存入fa所在的地址中。(fa,fp均为指针)
fwrite(fa, 4, 5, fp); //从fa的位置每次取4个字节,取5次,并放入fp所指向的文件中。
文件定位函数:rewind & fseek
先对rewind进行说明
rewind(fp); //将fp放置到文件开头
在对fseek进行说明
fseek(fp, 5, 0);
fseek函数比较复杂:
- 第一个参数fp为文件指针。
- 第二个参数为偏移量(一个long型变量)。
- 第三个参数为偏移起始点:
- SEEK_SET:代表文件开头(也可以用0代替)
- SEEK_CUR:代表现在fp所在的位置(也可以用1代替)
- SEEK_END:代表文件末尾(也可以用2代替)
文件的检测
错误检测:ferror
ferror(fp); //检测被操作文件的当前状态,正常则返回0,错误则返回1
清除出错:clearerr
clearerr(fp); //将所有文件错误标志与文件结束标志强制置0
以上,是文件操作的所有函数。
确实很复杂,并且博主用的也确实很少 (现在谁还用C语言编辑文档啊.jpg)
随用随取吧。
这篇博文就到这里~~