目录
一,什么是文件?
1,为什么使用文件?
在计算机编程中,文件是数据的有序集合,是计算机中用于存储数据的一种基本单位。它是一个命名的、有序的数据集合,如果不使用文件,数据存储在内存中,当程序退出或掉电时,数据就丢失了,而如果使用了文件,数据就会通常以二进制形式存储在计算机的长久性存储介质上,这样的话,数据就不会因为程序退出或掉电而丢失例如硬盘驱动器、固态驱动器、光盘、磁盘等。文件可以包含各种不同类型的数据,例如文本、图像、音频、视频、程序代码等。在C语言中,文件是通过文件指针来表示和操作的。
2,文件的特征和属性
- 文件名:每个文件都有一个唯一的名称,用于在文件系统中标识和访问文件。文件名通常由字母、数字、下划线和其他字符组成,可以包括文件扩展名以指示文件的类型。
- 文件类型:文件可以分为不同的类型,包括文本文件,图像文件,音频文件,可执行文件等。
- 文件大小:文件的大小表示文件中包含的数据量,通常以字节为单位。
- 文件路径:文件路径是指文件在文件系统中的位置。
- 文件权限:文件可以有不同的权限,用于控制对文件的访问。包括读取,写入和执行权限等。
- 创建日期和修改日期:通常记录了它的创建日期和最后修改日期,以便追踪文件的历史。
二,二进制文件和文本文件的区别
根据数据组织方式,数据文件被分为文本文件或二进制文件。
顾名思义,文本文件是用来存储文本信息的文件,通常使用字符编码(如ASCII或UTF-8)来存储文本字符。这意味着文本文件包含人类可读的文本,其中包括字母、数字、标点符号等。而二进制文件则是用来存储二进制信息的文件,数据以二进制形式表示,其中包括字节序列,可以包含任何类型的数据,如图像、音频、编译的程序代码等。这些数据不一定是人类可读的。
例如整数10000。它的二进制编码是:
0010 0111 0001 0000
数据以二进制的形式存储(小端字节序):
10 27 00 00
数据以ASCII码的形式存储:
'1' '0' '0' '0' '0' (即10000)。
三,文件的相关操作:
在介绍相关操作之前,我们先了解一下文件指针:
文件指针是一个指向文件的指针,它用于跟踪文件的位置和状态。C语言使用
FILE
结构来表示文件指针,可以通过声明FILE
类型的指针来创建文件指针变量。
例如:
FILE *filePointer;
1,文件的打开和关闭:
文件打开
在C语言中,你可以使用fopen函数来打开文件。fopen函数接受两个参数:文件名和打开模式。
其中,打开模式有以下几种:
"r"
:表示只读(文件必须存在)。"w"
:写入(如果文件存在,则清除文件内容,如果不存在,则新建一个空文件)。"a"
:追加(如果文件存在,则在文件末尾添加数据)。"rb"
:二进制模式下的只读。"wb"
:二进制模式下的写入。"ab"
:二进制模式下的追加。
例如,fopen要以只读方式打开一个名为 data.txt
的文件:
FILE *file = fopen("data.txt", "r");
if (file == NULL) {
perror("fopen"); //如果打开文件失败,显示错误信息。
return 1;
}
文件关闭
在完成文件操作后,务必使用
fclose
函数关闭文件,以释放资源并确保数据被写入磁盘。
例如:
fclose(file);
file = NULL;
2,文件的读写:
1,顺序读写:
用到的函数名和功能如下表所示:
函数名 | 功能 | 适用于 |
getc | 字符输入函数 | 所有输入流 |
fputc | 字符输出函数 | 所有输出流 |
fgets | 文本行输入函数 | 所有输入流 |
fputs | 文本行输出函数 | 所有输出流 |
fscanf | 格式化输入函数 | 所有输入流 |
fprintf | 格式化输出函数 | 所有输出流 |
fread | 二进制输入 | 文件 |
fwrite | 二进制输出 | 文件 |
用法简介:
fputc 和 fputc ,这两个函数通常用于文本文件的逐字符读写。
int ch = fgetc(file); // 从文件中读取一个字符
fputc(ch, file); // 将字符写入文件
fgets 和 fputs ,这两个函数通常用于文本文件的逐行读写。
char arr[100];
fgets(arr, sizeof(arr), file); // 从文件中读取一行
fputs(arr, file); // 将字符串写入文件
fscanf 和 fprintf ,这两个函数通常用于二进制文件的读写。
int value;
fscanf(file, "%d", &value); // 从文件中按格式读取整数
fprintf(file, "The value is %d", value); // 按格式将整数写入文件
fread 和 fwrite ,这对函数用于按格式读取和写入文件,通常用于解析和生成格式化的文本数据。
char arr[100];
fread(arr, sizeof(char), 100, file); // 从文件中读取100个字节
fwrite(arr, sizeof(char), 100, file); // 将100个字节写入文件
2,随机读写(fseek)
fseek
: fseek
函数用于设置文件指针的位置,以便在文件中移动到指定的位置。你可以使用 fseek
定位文件指针,然后使用顺序读写函数进行读写。
fseek(file, offset, origin); // 将文件指针移动到指定位置
其中:
file:
文件指针。offset:
相对于origin
参数的偏移量。origin:
可以是SEEK_SET
(文件开始)、SEEK_CUR
(当前位置)或SEEK_END
(文件末尾)。
四,文件读取结束的判定
被错误使用的 feof
feof(),它返回非零值(true)表示文件已结束,返回零值(false)表示文件还未结束。
牢记,在读取文件的过程中,不能使用 feof 函数的返回值直接来判断文件的是否结束。
feof 的作用是:当文件读取结束的时候判断读取结束的原因是否是遇到文件尾结束。
其结束原因可能有两种:
1,文件遇到末尾。
2,文件读取错误
正确的的判定方式可以使用 fopen 的返回值。
如:
FILE* file = fopen("example.txt", "r");
if (file) {
int ch;
while ((ch = fgetc(file)) != EOF) {
// 读取文件内容
}
// 在这里,如果不再执行读取操作,文件已结束
fclose(file);
}