C fputc 和 putc 函数
最后修改日期:2025 年 4 月 6 日
字符输出是 C 编程中的一项基本操作,它允许您将单个字符写入文件或标准输出。fputc
和 putc
函数是实现此目的的关键工具。本教程将深入探讨这两个函数,解释它们的区别,并提供实际示例。掌握这些函数将确保您在文件操作和输出流中实现精确的字符级控制。
什么是 fputc 和 putc?
fputc
函数将单个字符写入指定的输出流。它接受两个参数:要写入的字符和文件指针。putc
函数与之类似,但它可能被实现为一个宏。这两个函数在成功时返回写入的字符,在失败时返回 EOF
。它们通常用于将数据写入文件或标准输出。理解它们的行为是进行高效字符级 I/O 操作的关键。
将字符写入标准输出
此示例演示了如何将单个字符写入标准输出。
#include <stdio.h> int main() { char ch = 'A'; // Using fputc to write to stdout fputc(ch, stdout); fputc('\n', stdout); // Add newline // Using putc to write to stdout putc(ch, stdout); putc('\n', stdout); // Add newline return 0; }
在这里,我们使用 fputc
和 putc
将字符 'A' 写入标准输出 (stdout
)。每个函数都会被调用两次——一次用于字符,一次用于换行符。输出将显示两次 'A',每次都换行。对于标准输出,这两个函数的工作方式相似。
将字符写入文件
此示例展示了如何使用 fputc 将多个字符写入文件。
#include <stdio.h> int main() { FILE *fp = fopen("chars.txt", "w"); if (fp == NULL) { perror("Error opening file"); return 1; } char message[] = "Hello, World!"; for (int i = 0; message[i] != '\0'; i++) { fputc(message[i], fp); // Write each character } fclose(fp); return 0; }
该程序以写入模式打开 "chars.txt" 文件,并使用 fputc
将字符串 "Hello, World!" 的每个字符单独写入。循环会一直持续到遇到空终止符。在写入所有字符后,文件会被关闭。这演示了精确的字符级文件写入。
使用 putc 进行文件输出
此示例演示了使用 putc 将数据写入文件。
#include <stdio.h> int main() { FILE *fp = fopen("alphabet.txt", "w"); if (fp == NULL) { perror("Error opening file"); return 1; } for (char c = 'A'; c <= 'Z'; c++) { putc(c, fp); // Write each uppercase letter putc('\n', fp); // Add newline after each } fclose(fp); return 0; }
在这里,putc
将整个大写字母表写入 "alphabet.txt",每个字母占一行。循环从 'A' 到 'Z' 运行,演示了 putc
在受控迭代中的用法。结果是一个包含 26 行的文件,每行包含一个大写字母。
fputc 的错误处理
此示例展示了使用 fputc 时的正确错误处理。
#include <stdio.h> int main() { FILE *fp = fopen("output.txt", "w"); if (fp == NULL) { perror("Error opening file"); return 1; } int result = fputc('X', fp); if (result == EOF) { perror("Error writing character"); } else { printf("Successfully wrote character\n"); } fclose(fp); return 0; }
该程序尝试将 'X' 写入 "output.txt" 文件,并检查 fputc
的返回值。如果返回 EOF
,则表示写入过程中发生了错误。正确的错误处理可确保文件操作的健壮性。在处理关键数据时,应始终遵循此模式。
使用 fputc 写入二进制数据
此示例演示了使用 fputc 写入二进制数据。
#include <stdio.h> int main() { FILE *fp = fopen("data.bin", "wb"); if (fp == NULL) { perror("Error opening file"); return 1; } unsigned char bytes[] = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; for (int i = 0; i < sizeof(bytes); i++) { fputc(bytes[i], fp); // Write each byte } fclose(fp); return 0; }
该程序将一系列字节(在 ASCII 中拼写为 "Hello")写入二进制文件。每个字节都使用 fputc
单独写入。请注意二进制写入使用的 "wb" 模式。此技术对于在字节级别创建或修改二进制文件非常有用。
比较 fputc 和 putc
此示例重点介绍了 fputc 和 putc 之间的区别。
#include <stdio.h> int main() { // Using fputc with stdout printf("Using fputc: "); fputc('A', stdout); fputc('B', stdout); fputc('C', stdout); fputc('\n', stdout); // Using putc with stdout printf("Using putc: "); putc('X', stdout); putc('Y', stdout); putc('Z', stdout); putc('\n', stdout); // Using putc with a file FILE *fp = fopen("compare.txt", "w"); if (fp) { putc('1', fp); fputc('2', fp); putc('3', fp); fclose(fp); } return 0; }
该程序演示了 fputc
和 putc
在与 stdout
一起使用时会产生完全相同的结果。它还表明它们可以与文件互换使用。主要区别在于 putc
可能被实现为一个宏,这可能提供更好的性能。
使用 fputc 创建文件副本
此示例展示了如何使用 fputc 创建文件副本。
#include <stdio.h> int main() { FILE *src = fopen("source.txt", "r"); FILE *dest = fopen("copy.txt", "w"); if (!src || !dest) { perror("Error opening files"); return 1; } int ch; while ((ch = fgetc(src)) != EOF) { fputc(ch, dest); // Write each character to destination } fclose(src); fclose(dest); return 0; }
该程序逐个字符地读取 "source.txt"(使用 fgetc
)并将每个字符写入 "copy.txt"(使用 fputc
)。这展示了如何将这些函数组合用于文件操作。循环会一直持续到达到 EOF
,从而确保整个文件都被复制。
使用 fputc 和 putc 的最佳实践
- 检查返回值:对于关键写入操作,请务必验证返回值是否不是
EOF
。 - 为性能考虑使用 putc:当性能至关重要时,请优先使用
putc
,因为它可能是一个宏。 - 选择 fputc 以提高清晰度:当您希望显式调用函数时,请使用
fputc
。 - 优雅地处理错误:为文件操作实现适当的错误处理。
- 妥善关闭文件:在操作完成后,务必关闭文件,以防止资源泄露。
来源
本教程通过实际示例,探讨了 C 语言中的 fputc
和 putc
函数,并演示了它们的用法。这些函数为文件和标准流提供了至关重要的字符级输出功能。掌握它们对于 C 语言精确的 I/O 操作至关重要。
作者
列表 C 标准库。