C语言fputc函数详解:“文件的铜壶滴漏”

一句话理解 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语言中“一笔一画”书写字符的基础工具。
  • 精准控制:适用于需逐个字符处理的场景(如加密、协议封装)。
  • 安全第一:始终检查返回值,避免数据丢失或程序崩溃。