Day14 内容梳理:
目录
Chapter 10 文件操作
10.0 概述
文件分为磁盘文件和设备文件。
磁盘文件:指存储在外部介质上的相关数据的有序集合,使用时才调入内存
设备文件:把和主机相连的输入输出设备看作一个个文件。把它们的输入和输出当作是对磁盘文件的读和写。
所有的磁盘文件在本质上都是以字节为单位进行顺序存储的。
磁盘文件在逻辑上被分为文本文件和二进制文件。
文本文件:
基于字符编码的文件。
常见编码有ASCII、YNICODE等等。
一般可使用文本编辑器直接打开。
二进制文件:
基于值编码的文件。
把数据按其在内存中的存储形式原样输出到磁盘上
10.1 打开、关闭文件
(1)文件指针
在C语言中用一个指针变量指向一个文件,这个指针就被称为文件指针。
在使用任何文件之前,都必须先打开文件,使用完之后再关闭。
打开和关闭用的都是stdio库:#include<stdio.h>
如果没有关闭文件,则会在程序退出时统一关闭。
(2)打开文件 fopen()
一般将文件指针命名为fp。
打开方式:
FILE* fp = fopen(const char* 文件名, const char* 模式设置);
模式设置可选的参数:
模式设置 | |
r或rb | 以只读的方式打开文件(不创建文件,若该文件不存在则报错) |
w或wb | 以写的方式打开文件(文件存在,则清空文件;不存在则创建一个文件) |
a或ab | 以追加的方式打开文件,在末尾添加内容(文件不存在则创建一个文件) |
r+或rb+ | 以可读、可写的方式打开文件(不创建新文件) |
w+或wb+ | 以可读、可写的方式打开文件(文件存在则清空文件;不存在则创建文件) |
a+或ab+ | 以添加的方式打开文件并在末尾更改文件;若文件不存在则创建新文件 |
总而言之:
带r的都是只读方式,不创建文件。文件若不存在则报错。
带w的都包括写的方式,不论文件存不存在,清除掉旧的并创建新的
带a的都是追加/添加,打开文件并在末尾添加内容,若文件不存在则创建新文件。
以下图为例,以只读方式(“r”)打开D盘中名为abc.txt的文件。
若文件打开成功,则fp指针编程文件指针;打开失败则fp = NULL。
需要注意两点:(1)fopen()不太安全,所以要加#define _CRT_SECURE_NO_WARNINGS,而且要加在导入库的代码之前。 (2)一般的路径都是反斜杠\,但是在C语言中,\\才代表反斜杠。单斜杠\一般搭配其他符号使用(比如\n换行)。所以路径操作建议写成正斜杠/,或者双反斜杠\\
文件打开失败有三种情况
①找不到文件
②文件权限不足(读/写/执行)
③已打开的文件数量超过上限(65535个文件)。
因为文件打开失败的几率不小,所以最好加个fp == NULL的条件判断来处理。
(3)读取文件 fgetc()
往新建的abc.txt文件中加了句hello world。
不需要让文件指针++,因为文件中的光标会自行往下读取,只需要创建个指针然后不断让指针等于fgetc(文件指针)即可:
文件用-1作为文件终止符,是因为文件数据以ASCII码(范围是0-127)的形式存储,不可能出现-1,所以可用-1。
另外,可以把代码缩减一下。
由于都是逐字符读取再打印。而逐字符读取中,=的优先级低于判断是否终止的 !=,所以需要用括号括起来(read_ch = fgetc(fp)),再判断是否终止。
(4)写入文件 fputc()
接着用上面写入了hello world的文件abc.txt,右下角是输入的字符,而右侧则是已被更改的abc.txt文件。