一句话理解 fputc
「将字符像‘墨水’一样精准滴入文件或终端的‘笔尖’(文件流),完成单个字符的书写!」
函数原型
#include
int fputc(int char, FILE *stream);
入口参数
参数 | 类型 | 比喻解释 |
char | int | 要写入的字符(ASCII码或扩展字符) |
stream | FILE* | 字符的“书写目标”(如文件、屏幕) |
返回参数
返回值 | 含义 |
int | 成功写入的字符(ASCII码) |
EOF | 书写失败(如文件不可写或磁盘已满) |
核心功能图解
fputc('A', file); → 文件内容:A
fputc('\n', stdout); → 屏幕输出:换行
代码实例:字符书写实战
场景1:将字符串写入文件(逐字符写入)
#include
int main() {
FILE *file = fopen("secret.txt", "w"); // 打开“笔记本”
if (!file) {
perror(" 笔记本打不开");
return 1;
}
const char *message = "Hello, fputc!";
for (int i = 0; message[i] != '\0'; i++) {
// 逐字符写入文件
if (fputc(message[i], file) == EOF) {
printf(" 第%d个字符写入失败\n", i);
break;
}
}
fclose(file); // 合上笔记本
printf(" 信息已加密保存!\n");
return 0;
}
文件内容:Hello, fputc!
场景2:在屏幕上绘制ASCII艺术
#include
int main() {
// 用fputc向屏幕(stdout)输出
fputc('*', stdout);
for (int i = 0; i < 5; i++) {
fputc('\n', stdout); // 换行
fputc('*', stdout); // 左侧边界
fputc(' ', stdout); // 空格填充
fputc('*', stdout); // 右侧边界
}
fputc('\n', stdout);
return 0;
}
输出效果:
*
* *
* *
* *
* *
场景3:错误处理(检测磁盘是否写满)
#include
int main() {
FILE *file = fopen("huge_file.txt", "w");
if (!file) return 1;
for (int i = 0; i < 1000000; i++) { // 尝试写入100万个字符
if (fputc('A', file) == EOF) {
printf(" 磁盘已满!无法继续写入\n");
break;
}
}
fclose(file);
return 0;
}
技术细节剖析
1. 为何用 int 类型传递字符?
- 历史兼容性:早期C语言用 int 表示字符和 EOF(-1)。
- 安全检测:若传递 char,某些系统可能无法正确检测 EOF。
2. 与 putc 的异同
特性 | fputc | putc |
实现方式 | 标准函数 | 可能是宏(可能更快) |
适用场景 | 通用场景 | 高频调用(需注意副作用) |
安全性 | 参数只计算一次 | 若参数是表达式可能多次计算 |
常见错误
1. 向只读文件流写入
FILE *file = fopen("readonly.txt", "r"); // 只读模式打开
fputc('X', file); // 崩溃!文件未以写入模式打开
2. 忽略返回值导致数据丢失
fputc('A', file); // 不检查是否成功
// 正确做法:
if (fputc('A', file) == EOF) { /* 处理错误 */ }
高级技巧:实现简易加密
#include
void encrypt_file(FILE *src, FILE *dest, int key) {
int c;
while ((c = fgetc(src)) != EOF) {
fputc(c ^ key, dest); // 异或加密
}
}
int main() {
FILE *src = fopen("plain.txt", "r");
FILE *enc = fopen("encrypted.txt", "w");
if (!src || !enc) return 1;
encrypt_file(src, enc, 0x55); // 使用密钥0x55加密
fclose(src);
fclose(enc);
return 0;
}
总结表格
特性 | 说明 |
核心功能 | 安全写入单个字符到文件流 |
适用场景 | 日志记录、二进制文件操作、低层I/O |
安全要点 | 检查返回值,确保文件可写 |
总结
- 像书法家写字:fputc 是C语言中“一笔一画”书写字符的基础工具。
- 精准控制:适用于需逐个字符处理的场景(如加密、协议封装)。
- 安全第一:始终检查返回值,避免数据丢失或程序崩溃。