在C语言编程中,文件操作是一个重要的主题。无论是读取配置文件、记录日志,还是处理大量数据,文件操作都是必不可少的。本文将介绍C语言中文件操作的基本概念和常用方法,帮助你轻松掌握这项技能。
一、文件操作的基本概念
在C语言中,文件操作主要包括以下几步:
- 打开文件:创建一个文件指针,准备进行读写操作。
- 读取文件:从文件中读取数据。
- 写入文件:向文件中写入数据。
- 关闭文件:关闭文件指针,释放资源。
C语言中,文件操作使用标准库<stdio.h>
中的函数。文件操作的基本流程如下:
- 定义文件指针:
FILE *file;
- 打开文件:
file = fopen(filename, mode);
- 读/写文件:
fscanf(), fprintf(), fread(), fwrite()等
- 关闭文件:
fclose(file);
二、常见的文件打开模式
- 读取模式("r"):
- 用于打开一个已存在的文件以供读取。
- 如果文件不存在,
fopen()
返回NULL
。 - 文件的指针会被放在文件的开头。
- 写入模式("w"):
- 用于创建一个新文件以供写入。
- 如果文件已存在,则会被清空(即删除文件中的所有内容)。
- 如果文件不存在,将会创建一个新文件。
- 如果创建文件失败,
fopen()
返回NULL
。 - 文件的指针会被放在文件的开头。
- 追加模式("a"):
- 用于在文件末尾追加数据。
- 如果文件不存在,将会创建一个新文件。
- 文件的指针会被放在文件的末尾。
- 如果创建文件失败,
fopen()
返回NULL
。
- 二进制模式("b"):
- 用于以二进制方式打开文件,适用于处理二进制数据。
- 这个标志可以与上述任何模式("r"、"w"、"a")组合使用,例如:"rb"、"wb"、"ab"。
- 读取/写入模式("r+"、"w+"、"a+"):
- 用于同时读取和写入文件。
"r+"
:打开文件用于读取和写入,文件必须存在。"w+"
:创建一个新文件用于读取和写入,如果文件已存在,则清空文件。"a+"
:打开文件用于读取和写入,写入操作在文件末尾进行,如果文件不存在,则创建一个新文件。
三、文件读写操作
1. 读取文件
读取文件的常用方法有:
fgetc(FILE *stream)
:从文件中读取一个字符。fgets(char *str, int n, FILE *stream)
:从文件中读取一行。fscanf(FILE *stream, const char *format, ...)
:从文件中读取格式化数据。fread(void *ptr, size_t size, size_t count, FILE *stream)
:从文件中读取二进制数据。
2. 写入文件
写入文件的常用方法有:
fputc(int char, FILE *stream)
:向文件写入一个字符。fputs(const char *str, FILE *stream)
:向文件写入一个字符串。fprintf(FILE *stream, const char *format, ...)
:向文件写入格式化数据。fwrite(const void *ptr, size_t size, size_t count, FILE *stream)
:向文件写入二进制数据。
四、文件的关闭
在完成文件读写操作后,必须关闭文件以释放资源。使用fclose(FILE *stream)
函数关闭文件
FILE *file;
file = fopen("example.txt", "r");
if (file != NULL) {
// 文件操作
fclose(file);
}
五、错误处理
在文件操作过程中,可能会遇到各种错误,例如文件不存在、权限不足等。可以使用perror()
或strerror()
函数打印错误信息
FILE *file;
file = fopen("example.txt", "r");
if (file == NULL) {
perror("Error opening file");
return -1;
}
六、文件的随机读写
fseek(FILE *stream, long offset, int whence)
:移动文件指针到指定位置。ftell(FILE *stream)
:获取当前文件指针的位置。rewind(FILE *stream)
:将文件指针移动到文件开始处。
fseek
参数说明
stream
: 文件指针,指向已打开的文件。offset
: 相对于whence
参数的偏移量(以字节为单位)。- 如果
offset
为正数,文件指针向前移动(从基准位置向文件末尾方向移动)。 - 如果
offset
为负数,文件指针向后移动(从基准位置向文件开头方向移动)。
- 如果
whence
: 文件指针的位置基准。它可以是以下三个常量之一:SEEK_SET
: 文件的开头。SEEK_CUR
: 文件指针的当前位置。SEEK_END
: 文件的末尾。
返回值
- 成功时返回 0。
- 失败时返回非零值,并设置
errno
。
ftell
参数说明
stream
: 文件指针,指向已打开的文件。
返回值
- 成功时返回当前文件指针相对于文件开头的字节偏移量。
- 失败时返回 -1,并设置
errno
以指示错误。
rewind
参数说明
stream
: 文件指针,指向已打开的文件。
无返回值
文件读取结束的判定
fgetc
:读取单个字符,返回值为EOF
表示文件结束。fgets
:读取一行字符,返回值为NULL
表示文件结束。fread
:读取块数据,返回值为读取到的项数,当少于请求的项数或为零时表示文件结束.
标准流
标准输入流(stdin)
- 标准输入流是程序默认的输入源。
- 当程序从标准输入读取数据时,它实际上是从 stdin 中读取。
- 在终端中,通常使用键盘输入数据,这些数据就被送到了 stdin 中。
标准输出流(stdout)
stdout
是标准输出流,用于将程序的输出发送到终端(或控制台)。在 C 语言中,可以使用各种函数将数据写入stdout
,如printf()
、fprintf()
、puts()
、putchar()
等。- 标准输出流是程序默认的输出目标。
- 当程序向标准输出写入数据时,它实际上是写入到 stdout 中。
- 在终端中,标准输出的内容通常显示在屏幕上。
标准错误流(stderr)
- 标准错误流用于输出程序的错误消息和诊断信息。
- 与标准输出类似,当程序向标准错误写入数据时,它实际上是写入到 stderr 中。
- 在终端中,标准错误流的内容通常也显示在屏幕上,但与标准输出有所区别,允许将错误消息与标准输出区分开来。