C 文件读写
关键要点
- C语言的文件读写通过标准库
<stdio.h>
中的函数实现,主要包括fopen
(打开文件)、fclose
(关闭文件)、fread
/fwrite
(读写二进制文件)以及fscanf
/fprintf
(格式化读写文本文件)。 - 研究表明,文件操作通常分为文本模式和二进制模式,文本模式适合人类可读的数据,二进制模式适合高效存储复杂数据。
- 证据倾向于建议在使用文件操作时,始终检查
fopen
的返回值以确保文件成功打开,并使用适当的模式(如“r”读取、“w”写入)。
文件读写概述
C语言提供强大的文件读写功能,允许程序与外部存储设备(如硬盘)交互,持久化存储和读取数据。以下是关于C语言文件读写的详细指南,涵盖文件类型、文件指针、打开模式、读写函数以及关闭文件等内容。
文件类型
- 文本文件:以ASCII字符形式存储数据,可直接用文本编辑器打开和编辑。常见扩展名如
.txt
。 - 二进制文件:以二进制形式(0和1)存储数据,不易直接阅读,通常用于存储复杂数据结构。常见扩展名如
.bin
。
文件指针
- 文件指针是C语言中用于表示文件的引用,用于执行文件操作(如打开、读取、写入、关闭)。
- 文件指针的类型为
FILE
,定义在<stdio.h>
头文件中。 - 声明方式:
FILE *fp;
打开文件
- 使用
fopen()
函数打开文件。 - 语法:
FILE *fopen(const char *filename, const char *mode);
- 参数:
filename
:文件名或路径。mode
:指定打开文件的目的(例如,“r”表示读取,“w”表示写入,“a”表示追加)。- 返回值:成功时返回文件指针,失败时返回
NULL
。
文件打开模式
文件打开模式决定了文件的操作方式,以下是常见模式:
- 读取模式:
"r"
:以文本模式读取。如果文件不存在,返回NULL
。"rb"
:以二进制模式读取。- 写入模式:
"w"
:以文本模式写入。如果文件存在,则截断;如果不存在,则创建。"wb"
:以二进制模式写入。- 追加模式:
"a"
:以文本模式追加。如果文件不存在,则创建。"ab"
:以二进制模式追加。- 读写模式:
"r+"
:以文本模式读写。"rb+"
:以二进制模式读写。"w+"
:以文本模式读写,存在则截断,不存在则创建。"wb+"
:以二进制模式读写。"a+"
:以文本模式读写,追加模式。"ab+"
:以二进制模式读写,追加模式。
创建文件
- 要创建新文件,使用
fopen()
并选择适当的模式,如"w"
、"w+"
、"wb"
、"wb+"
、"a"
、"a+"
、"ab"
或"ab+"
。
写入文件
- 使用以下函数向文件写入数据:
fprintf()
:格式化输出,类似于printf()
。fputs()
:写入字符串,带换行符。fputc()
:写入单个字符。fputw()
:写入数字。fwrite()
:写入二进制数据。- 语法:
fwrite(ptr, size, nmemb, file_pointer)
- 语法:
读取文件
- 使用以下函数从文件中读取数据:
fscanf()
:格式化输入,类似于scanf()
。fgets()
:读取整行文本。fgetc()
:读取单个字符。fgetw()
:读取数字。fread()
:读取二进制数据。- 语法:
fread(ptr, size, nmemb, file_pointer)
- 语法:
- 注意:读取时,文件结束时返回
EOF
,需检查以避免错误。
关闭文件
- 操作完成后,使用
fclose(file_pointer)
关闭文件,释放资源。
移动文件指针
- 使用
fseek(fp, offset, whence)
移动文件指针。 whence
可以是:SEEK_SET
:从文件开头计算。SEEK_CUR
:从当前位置计算。SEEK_END
:从文件末尾计算。- 示例:
rewind(fp);
将指针移动到文件开头。
二进制文件操作
- 二进制文件通常使用
"rb"
、"wb"
、"ab"
等模式打开。 - 写入使用
fwrite()
,读取使用fread()
。
详细报告
C语言的文件读写功能是程序与外部存储设备交互的核心,允许持久化存储和读取数据。以下是基于可靠来源(如GeeksforGeeks、Programiz和TutorialsPoint)的详细分析,涵盖文件操作的各个方面。
文件类型与特性
文件分为两种主要类型:
- 文本文件:存储为ASCII字符,适合人类可读的数据,如日志文件。优点是易于编辑,缺点是存储效率较低。
- 二进制文件:以0和1的形式存储,适合存储复杂数据结构,如图像或程序执行文件。优点是存储效率高,安全性较高,缺点是不可直接阅读。
文件指针与标准库
文件操作依赖于<stdio.h>
中的FILE
类型,文件指针是所有文件操作的核心。声明文件指针的示例:
FILE *fp;
文件指针用于跟踪文件的位置和状态,所有读写操作都通过它进行。
文件打开与模式
fopen()
函数是打开文件的入口,语法为:
FILE *fopen(const char *filename, const char *mode);
filename
可以是相对路径(如”example.txt”)或绝对路径。mode
决定了文件的操作方式,常见模式如下表所示:
模式 | 描述 | 文本/二进制 |
---|---|---|
“r” | 读取,文件不存在返回NULL | 文本 |
“rb” | 读取二进制文件 | 二进制 |
“w” | 写入,存在则截断,不存在则创建 | 文本 |
“wb” | 写入二进制文件 | 二进制 |
“a” | 追加,文件末尾写入,不存在则创建 | 文本 |
“ab” | 追加二进制文件 | 二进制 |
“r+” | 读写,文件不存在返回NULL | 文本 |
“rb+” | 读写二进制文件 | 二进制 |
“w+” | 读写,存在则截断,不存在则创建 | 文本 |
“wb+” | 读写二进制文件 | 二进制 |
“a+” | 读写,追加模式 | 文本 |
“ab+” | 读写二进制文件,追加模式 | 二进制 |
研究表明,选择适当的模式对文件操作的安全性和效率至关重要。例如,使用"w"
模式会覆盖现有文件,需谨慎操作。
文件创建
创建文件时,通常使用写入或追加模式,如"w"
或"a"
。如果文件不存在,fopen()
会自动创建;如果存在,"w"
会清空内容,"a"
会在末尾追加。
写入文件函数
以下是常用写入函数:
fprintf(fp, "格式化字符串", 参数);
:类似于printf()
,支持格式化输出。fputs("字符串\n", fp);
:写入字符串,自动添加换行。fputc('字符', fp);
:写入单个字符。fputw(数字, fp);
:写入整数。fwrite(ptr, size, nmemb, fp);
:写入二进制数据,适合复杂数据结构。
示例:
FILE *fp = fopen("output.txt", "w");
fprintf(fp, "数字:%d\n", 10);
fclose(fp);
读取文件函数
以下是常用读取函数:
fscanf(fp, "格式化字符串", &变量);
:格式化输入,类似于scanf()
。fgets(buffer, sizeof(buffer), fp);
:读取整行文本。fgetc(fp);
:读取单个字符。fgetw(fp);
:读取整数。fread(ptr, size, nmemb, fp);
:读取二进制数据。
读取时需注意文件结束标志EOF
,示例:
FILE *fp = fopen("input.txt", "r");
char buffer[255];
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
关闭文件
使用fclose(fp)
关闭文件,释放资源。研究建议始终关闭文件以避免资源泄漏,尤其在处理多个文件时。
文件指针移动
fseek()
函数用于移动文件指针,语法为:
int fseek(FILE *stream, long offset, int whence);
whence
可以是SEEK_SET
(文件开头)、SEEK_CUR
(当前位置)、SEEK_END
(文件末尾)。- 示例:
rewind(fp);
将指针移动到文件开头。
二进制文件操作
二进制文件操作通常使用"rb"
、”wb”等模式,fwrite()
和fread()
是核心函数。示例:
FILE *fp = fopen("data.bin", "wb");
int data = 100;
fwrite(&data, sizeof(int), 1, fp);
fclose(fp);
最佳实践
- 始终检查
fopen()
返回值,避免空指针操作。 - 使用适当的模式,避免意外覆盖文件。
- 处理文件结束时,检查
EOF
以确保读取完整。 - 关闭文件后,确认操作成功。
示例代码
以下是一个综合示例,展示文件读写操作:
#include <stdio.h>
int main() {
FILE *fp;
char buffer[255];
// 写入文件
fp = fopen("example.txt", "w");
if (fp == NULL) {
printf("无法打开文件。\n");
return 1;
}
fprintf(fp, "Hello, World!\n");
fclose(fp);
// 读取文件
fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("无法打开文件。\n");
return 1;
}
fgets(buffer, sizeof(buffer), fp);
printf("读取内容:%s", buffer);
fclose(fp);
return 0;
}