C 语言文件 I/O 实战:创建、打开、读写与二进制操作
上章解释了 C 语言处理的标准输入输出设备。本章讲解 C 程序员如何创建、打开、关闭文本或二进制文件进行数据存储。
文件代表字节序列,无论文本或二进制文件。C 提供高级函数和低级(OS 级)调用处理存储设备文件。本章介绍文件管理重要调用。
打开文件
使用 fopen() 函数创建新文件或打开现有文件。此调用初始化 FILE 类型对象,包含控制流所需所有信息。原型:
FILE *fopen( const char * filename, const char * mode );
filename 为字符串字面量,用于命名文件;mode 可取以下值:
| 序号 | 模式及说明 |
|---|---|
| 1 | r 以读方式打开现有文本文件。 |
| 2 | w 以写方式打开文本文件。不存在则创建。从文件开头开始写。 |
| 3 | a 以追加方式打开文本文件写。不存在则创建。在现有内容后追加。 |
| 4 | r+ 以读写方式打开文本文件。 |
| 5 | w+ 以读写方式打开文本文件。存在则截断为零长度,否则创建。 |
| 6 | a+ 以读写方式打开文本文件。不存在则创建。读从开头开始,写只能追加。 |
处理二进制文件时用以下访问模式替代上述:
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
关闭文件
关闭文件用 fclose() 函数。原型:
int fclose( FILE *fp );
fclose() 成功返回 0,关闭出错返回 EOF。此函数将缓冲区未决数据刷新到文件、关闭文件、释放文件用内存。EOF 为 stdio.h 中定义的常量。
C 标准库提供多种函数逐字符或定长字符串形式读写文件。
写文件
向流写单字符最简单函数:
int fputc( int c, FILE *fp );
fputc() 将参数 c 字符值写入 fp 引用的输出流。成功返回写入字符,出错返回 EOF。写空终止字符串到流可用:
int fputs( const char *s, FILE *fp );
fputs() 将字符串 s 写入 fp 引用输出流。成功返回非负值,出错返回 EOF。也可用 int fprintf(FILE *fp,const char *format, ...) 写格式化字符串到文件。尝试示例:
确保机器有 /tmp 目录,没有则先创建。
#include <stdio.h> main() { FILE *fp; fp = fopen("/tmp/test.txt", "w+"); fprintf(fp, "This is testing for fprintf...\n"); fputs("This is testing for fputs...\n", fp); fclose(fp); }
编译执行后在 /tmp 创建 test.txt 并用两函数写两行。下节读取此文件。
读文件
从文件读单字符最简单函数:
int fgetc( FILE * fp );
fgetc() 从 fp 引用输入文件读字符。返回读取字符,出错返回 EOF。读字符串函数:
char *fgets( char *buf, int n, FILE *fp );
fgets() 从 fp 引用输入流读最多 n-1 字符。将读取字符串复制到缓冲区 buf,追加 空字符 终止字符串。
若遇换行符 '\n' 或 EOF 在读满最大字符前,则仅返回截至该点字符(含换行符)。也可用 int fscanf(FILE *fp, const char *format, ...) 从文件读字符串,但遇首个空格即停止读取。
#include <stdio.h> main() { FILE *fp; char buff[255]; fp = fopen("/tmp/test.txt", "r"); fscanf(fp, "%s", buff); printf("1 : %s\n", buff ); fgets(buff, 255, (FILE*)fp); printf("2: %s\n", buff ); fgets(buff, 255, (FILE*)fp); printf("3: %s\n", buff ); fclose(fp); }
编译执行读取上节创建文件,输出:
1 : This 2: is testing for fprintf... 3: This is testing for fputs...
详细分析:第一 fscanf() 只读 This 因随后遇空格;第二 fgets() 读剩余行至行尾;第三 fgets() 完整读第二行。
二进制 I/O 函数
两函数用于二进制输入输出:
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file); size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
这两函数应用于读写内存块——通常为数组或结构体。
C语言
- I/O 卡深度解析:工作原理、工业级应用与维修价值
- 单点I/O保护:熔断器还是断路器?
- Axiomtek IPS960-511-PoE:面向工业检测的一体化坚固视觉控制器
- acceed EDAM-4200 系列:集成 I/O 模块,实现可扩展、可靠的数据通信
- C 语言输入输出(I/O)精通:scanf() 与 printf() 详解
- C语言文件处理完全指南:fopen、fprintf、fread 与 fseek
- C 语言函数详解:定义、声明、调用与参数传递
- C 语言头文件详解:类型、用法与最佳实践
- C# 文件 I/O 完全指南:流、读写操作与文件系统管理
- MATLAB 数据导出完全指南:ASCII、日志、低级 I/O 与电子表格
- Python 文件 I/O:掌握文件操作、读写与管理
- Python 文件 I/O:掌握输入输出操作