一句话总结
printf:将格式化后的输出打印到标准输出(通常是你的终端/控制台)。fprintf:将格式化后的输出打印到指定的文件流(可以是标准输出,也可以是你打开的任何文件)。
printf - 标准输出打印函数
printf 是最常用的输出函数,它的全称是 "Print Formatted"(格式化打印)。

(图片来源网络,侵删)
函数原型
#include <stdio.h> int printf(const char *format, ...);
参数说明
const char *format:这是一个格式化字符串,它包含了两种字符:- 普通字符:会原样输出到屏幕上。
- 格式转换说明符:以 开头,用于指定后续参数的类型和输出格式。
%d:十进制整数%f:浮点数%c:单个字符%s:字符串%p:指针地址- 输出一个 字符本身
- (省略号):这是可变参数列表,你需要提供与格式字符串中
format说明符数量和类型相匹配的变量。
返回值
- 成功时,返回成功打印的字符总数(不包括字符串末尾的
\0)。 - 失败时,返回一个负数。
示例代码
#include <stdio.h>
int main() {
int age = 30;
float height = 175.5f;
char name[] = "Alice";
// 普通字符和格式说明符混合
printf("Name: %s\n", name); // 输出: Name: Alice
printf("Age: %d, Height: %.2f cm\n", age, height); // 输出: Age: 30, Height: 175.50 cm
// 计算字符总数
int chars_printed = printf("This is a test.\n");
printf("The last printf printed %d characters.\n", chars_printed);
return 0;
}
输出:
Name: Alice
Age: 30, Height: 175.50 cm
This is a test.
The last printf printed 15 characters.
fprintf - 文件流打印函数
fprintf 是 printf 的一个更通用的版本。f 代表 "file"(文件),它允许你将输出重定向到任何已打开的文件流。
函数原型
#include <stdio.h> int fprintf(FILE *stream, const char *format, ...);
参数说明
FILE *stream:这是第一个参数,也是它与printf最关键的区别,它是一个指向FILE对象的指针,这个对象代表一个文件流。- 你可以使用
fopen()函数打开一个文件,并获取这个指针。 - C 语言也预定义了三个标准文件流,你可以直接使用:
stdout:标准输出(和printf的目标一样)stderr:标准错误(通常也是你的终端)stdin:标准输入(通常是你的键盘)
- 你可以使用
const char *format:和printf一样,是格式化字符串。- (省略号):和
printf一样,是可变参数列表。
返回值
- 成功时,返回成功写入的字符总数。
- 失败时,返回一个负数。
示例代码
示例 1:将输出写入普通文件
#include <stdio.h>
int main() {
FILE *pFile; // 声明一个文件指针
int age = 30;
char name[] = "Bob";
// 以写入模式("w")打开文件 "output.txt"
// 如果文件不存在,会创建;如果存在,内容会被清空
pFile = fopen("output.txt", "w");
// 检查文件是否成功打开
if (pFile == NULL) {
perror("Error opening file");
return 1;
}
// 使用 fprintf 将格式化数据写入文件
fprintf(pFile, "User Name: %s\n", name);
fprintf(pFile, "User Age: %d\n", age);
// 关闭文件,这是一个好习惯
fclose(pFile);
printf("Data has been written to output.txt\n");
return 0;
}
执行后:
- 你的终端会显示:
Data has been written to output.txt - 在你的程序目录下会生成一个
output.txt文件,内容为:User Name: Bob User Age: 30
示例 2:使用 fprintf 和 stdout 模拟 printf
fprintf 的第一个参数是 stdout 时,它的行为和 printf 完全一样。

(图片来源网络,侵删)
#include <stdio.h>
int main() {
int number = 123;
// 这两行代码的效果完全相同
printf("This is from printf.\n");
fprintf(stdout, "This is from fprintf with stdout.\n");
return 0;
}
输出:
This is from printf.
This is from fprintf with stdout.
示例 3:使用 fprintf 和 stderr 输出错误信息
程序的标准输出(stdout)可能被重定向(保存到文件),但标准错误(stderr)仍然会显示在终端上,错误信息应该使用 fprintf(stderr, ...) 来打印。
#include <stdio.h>
int main() {
int divisor = 0;
int result;
if (divisor == 0) {
// 使用 stderr 打印错误信息,更规范
fprintf(stderr, "Error: Division by zero is not allowed!\n");
return 1; // 返回非零值表示程序异常终止
}
result = 100 / divisor;
printf("Result is: %d\n", result);
return 0;
}
输出(在终端上):
Error: Division by zero is not allowed!
总结与对比
| 特性 | printf |
fprintf |
|---|---|---|
| 全称 | Print Formatted | File Print Formatted |
| 目标 | 固定为标准输出 (stdout) |
可变,由第一个参数 FILE *stream 指定 |
| 函数原型 | int printf(const char *format, ...); |
int fprintf(FILE *stream, const char *format, ...); |
| 主要用途 | 向控制台/终端输出信息 | 向文件、标准输出、标准错误等任意流输出信息 |
| 关系 | printf 是 fprintf(stdout, ...) 的简写形式 |
fprintf 是更通用、更底层的输出函数 |
何时使用哪个?
- 使用
printf:当你只是想在屏幕上显示一些信息、调试代码或者与用户进行简单的交互式对话时,这是最常见、最简单的选择。 - 使用
fprintf:- 需要将数据保存到文件时(如日志文件、配置文件、数据导出等)。
- 需要输出错误信息时:使用
fprintf(stderr, ...)是一个非常好的编程实践,因为它能确保错误信息即使在标准输出被重定向后也能被用户看到。 - 需要代码更清晰时:明确写出
fprintf(stdout, ...)可以让代码的意图更加清晰,即“这是一个向标准输出写入的操作”。
希望这个详细的解释能帮助你完全理解 printf 和 fprintf 的区别与用法!

(图片来源网络,侵删)
