【C语言】知识总结·文件操作
目录
一·文件的概念
二·文件的分类
1. 文本文件(Text Files)
2. 二进制文件(Binary Files)
三·文件操作的基本步骤
文件指针
打开文件(fopen 函数)
文件打开模式
关闭文件(fclose 函数)
四·文件的读写操作
1. 文本文件读写
字符读写(fgetc/fputc)
字符串读写(fgets/fputs)
格式化读写(fscanf/fprintf)
五·文件定位与随机访问
六·错误处理
七·文件缓冲区管理
八·文件操作的最佳实践
九·总结
前言:
在 C 语言里,文件操作是很重要的内容,主要用于对外部文件进行读写操作。下面为你详细介绍 C 语言文件操作的相关知识。
一·文件的概念
文件是存储在计算机外部介质(如硬盘、U盘等)上的数据集合,可以是文本文档、图像、音频等。在C语言中,文件被视为一系列字节的序列,可以进行读写操作。文件操作依赖于标准库 <stdio.h>
中定义的 FILE
结构体和相关函数。
二·文件的分类
根据文件内容和用途的不同,文件可以分为两类:
1. 文本文件(Text Files)
- 特点:由ASCII字符或其扩展集构成,可以使用文本编辑器打开。
- 读写方式:使用
fscanf
、fprintf
、getc
、putc
、fgets
、fputs
等函数进行读写。 - 缓冲机制:默认是行缓冲,即在遇到换行符时才进行实际的I/O操作。
- 优点:通用性强,易于阅读和编辑。
- 缺点:不适合存储二进制数据,如图像、音频等。
2. 二进制文件(Binary Files)
- 特点:以原始字节形式存储数据,如图像、音频、程序等。
- 读写方式:使用
fread
、fwrite
进行块读写。 - 缓冲机制:默认是块缓冲,适合处理大量数据。
- 优点:存储效率高,适合处理非文本数据。
- 缺点:无法直接用文本编辑器打开,且读写过程较为复杂。
三·文件操作的基本步骤
在C语言中,文件操作通常包括以下几个步骤:
- 定义文件指针:使用
FILE *
类型的变量来表示文件。 - 打开文件:使用
fopen
函数打开文件,指定文件名和打开模式。 - 读写文件:根据文件类型选择合适的读写函数(如
fprintf
、fscanf
、fread
、fwrite
)。 - 关闭文件:使用
fclose
函数关闭文件,释放资源。
文件指针
在 C 语言中,进行文件操作要用到文件指针,它的类型是FILE*
。文件指针就像一个 “桥梁”,通过它可以对文件进行各种操作。
FILE *fp; // 声明一个文件指针
打开文件(fopen 函数)
FILE *fopen(const char *filename, const char *mode);
filename
指的是要打开的文件名称。
文件打开模式
mode
表示文件的打开模式,常见的模式有以下几种:"r"
:以只读方式打开文件,要求文件必须已经存在。"w"
:以写入方式打开文件,如果文件不存在就会创建一个新文件;如果文件已存在,则会清空文件内容。"a"
:以追加方式打开文件,如果文件不存在会创建新文件,写入的数据会添加到文件原有内容的后面。"r+"
:以读写方式打开文件,文件必须已经存在。"w+"
:以读写方式打开文件,若文件不存在会创建新文件,不过会先清空原有文件内容。"a+"
:以读写方式打开文件,若文件不存在会创建新文件,写入的数据会追加到文件末尾。
FILE *fp = fopen("test.txt", "r");//只读
if (fp == NULL) {perror("文件打开失败");exit(EXIT_FAILURE);
}
关闭文件(fclose 函数)
int fclose(FILE *fp);
文件使用完毕后,一定要调用fclose
函数将其关闭,这样可以释放系统资源。该函数执行成功时返回 0,失败时返回 EOF。
fclose(fp);
四·文件的读写操作
1. 文本文件读写
- 格式化读写:使用
fprintf
和fscanf
进行格式化输出和输入。 - 字符读写:使用
putc
和getc
读写单个字符。 - 字符串读写:使用
fputs
和fgets
读写字符串。
FILE *fp = fopen("example.txt", "w");
fprintf(fp, "Hello, World!");
fclose(fp);
字符读写(fgetc/fputc)
- fgetc:从文件中读取一个字符。
int fgetc(FILE *fp);
示例:
int ch;
while ((ch = fgetc(fp)) != EOF) {printf("%c", ch);
}
fputc:向文件中写入一个字符。
int fputc(int c, FILE *fp);
示例;
fputc('A', fp);
字符串读写(fgets/fputs)
fgets:从文件中读取一行字符串。
char *fgets(char *str, int n, FILE *fp);
示例:
char buffer[100];
fgets(buffer, 100, fp);
fputs:向文件中写入一个字符串。
int fputs(const char *str, FILE *fp);
示例:
fputs("Hello, World!\n", fp);
格式化读写(fscanf/fprintf)
- fscanf:从文件中按照指定格式读取数据。
示例:int fscanf(FILE *fp, const char *format, ...);
int num; fscanf(fp, "%d", &num);
- fprintf:按照指定格式向文件中写入数据。
示例:int fprintf(FILE *fp, const char *format, ...);
fprintf(fp, "%d %s", 10, "apple");
五·文件定位与随机访问
C语言提供了以下文件定位和随机访问函数:
- fseek:移动文件指针到指定位置
- ftell:获取当前文件指针位置
- rewind:将文件指针重置至文件起始位置
- 示例代码:
FILE *fp = fopen("data.bin", "rb"); fseek(fp, 10, SEEK_SET); // 将指针移动到第10个字节 fclose(fp);
六·错误处理
在文件操作中,可能会遇到各种错误,如文件不存在、权限不足等。C语言提供了以下函数用于错误处理:
feof
:检测是否到达文件末尾。ferror
:检测是否发生读写错误。perror
:打印错误信息。- 示例代码:
FILE *fp = fopen("example.txt", "r"); if (fp == NULL) {perror("Error opening file");return 1; } fclose(fp);
七·文件缓冲区管理
在 C 语言里,文件操作一般借助缓冲区来提升 I/O 效率。缓冲区有行缓冲、块缓冲和无缓冲这几种类型。一般来说,文本文件采用行缓冲,二进制文件则使用块缓冲。要是你想手动设置缓冲区,可以使用setvbuf
函数。
八·文件操作的最佳实践
- 及时关闭文件:文件用完后,要马上用
fclose
释放文件资源,防止出现资源泄漏的情况。 - 合理使用
ferror
和clearerr
:利用ferror
检测文件操作过程中是否有错误发生,通过clearerr
清除错误状态,让文件操作能够继续正常进行。 - 避免使用
gets
函数:gets
函数在读取输入时不会检查缓冲区的大小,很容易造成缓冲区溢出,引发安全问题,所以要尽量避免使用它。 - 适时使用
fflush
函数:往文件写入数据后,调用fflush
函数刷新缓冲区,这样能保证数据真正写入磁盘,防止数据丢失。 - 灵活运用
remove
和rename
函数:remove
函数可以用来删除不再需要的文件,rename
函数则能对文件进行重命名,方便文件的管理。
九·总结
在 C 语言中,文件操作是处理持久化数据的一项基础技能。通过 C 语言标准库提供的一系列函数,我们能够轻松实现文件的打开、读写、关闭以及错误处理等操作。要想编写出高效、安全的程序,就必须掌握文件操作的基本概念、文件的分类、不同的读写方式、文件定位与随机访问方法以及错误处理等知识点。当然,仅仅了解这些理论知识是不够的,还需要通过实际的编程练习,不断加深对文件操作的理解和应用能力,从而在实际开发中能够熟练、灵活地运用文件操作相关知识。