printf与fprintf有何区别?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 C语言 正文

一句话总结

  • printf:将格式化后的输出打印到标准输出(通常是你的终端/控制台)。
  • fprintf:将格式化后的输出打印到指定的文件流(可以是标准输出,也可以是你打开的任何文件)。

printf - 标准输出打印函数

printf 是最常用的输出函数,它的全称是 "Print Formatted"(格式化打印)。

c语言 printf fprintf
(图片来源网络,侵删)

函数原型

#include <stdio.h>
int printf(const char *format, ...);

参数说明

  1. const char *format:这是一个格式化字符串,它包含了两种字符:
    • 普通字符:会原样输出到屏幕上。
    • 格式转换说明符:以 开头,用于指定后续参数的类型和输出格式。
      • %d:十进制整数
      • %f:浮点数
      • %c:单个字符
      • %s:字符串
      • %p:指针地址
      • 输出一个 字符本身
  2. (省略号):这是可变参数列表,你需要提供与格式字符串中 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 - 文件流打印函数

fprintfprintf 的一个更通用的版本。f 代表 "file"(文件),它允许你将输出重定向到任何已打开的文件流。

函数原型

#include <stdio.h>
int fprintf(FILE *stream, const char *format, ...);

参数说明

  1. FILE *stream:这是第一个参数,也是它与 printf 最关键的区别,它是一个指向 FILE 对象的指针,这个对象代表一个文件流。
    • 你可以使用 fopen() 函数打开一个文件,并获取这个指针。
    • C 语言也预定义了三个标准文件流,你可以直接使用:
      • stdout:标准输出(和 printf 的目标一样)
      • stderr:标准错误(通常也是你的终端)
      • stdin:标准输入(通常是你的键盘)
  2. const char *format:和 printf 一样,是格式化字符串。
  3. (省略号):和 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:使用 fprintfstdout 模拟 printf

fprintf 的第一个参数是 stdout 时,它的行为和 printf 完全一样。

c语言 printf fprintf
(图片来源网络,侵删)
#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:使用 fprintfstderr 输出错误信息

程序的标准输出(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, ...);
主要用途 向控制台/终端输出信息 向文件、标准输出、标准错误等任意流输出信息
关系 printffprintf(stdout, ...) 的简写形式 fprintf 是更通用、更底层的输出函数

何时使用哪个?

  • 使用 printf:当你只是想在屏幕上显示一些信息、调试代码或者与用户进行简单的交互式对话时,这是最常见、最简单的选择。
  • 使用 fprintf
    1. 需要将数据保存到文件时(如日志文件、配置文件、数据导出等)。
    2. 需要输出错误信息时:使用 fprintf(stderr, ...) 是一个非常好的编程实践,因为它能确保错误信息即使在标准输出被重定向后也能被用户看到。
    3. 需要代码更清晰时:明确写出 fprintf(stdout, ...) 可以让代码的意图更加清晰,即“这是一个向标准输出写入的操作”。

希望这个详细的解释能帮助你完全理解 printffprintf 的区别与用法!

c语言 printf fprintf
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
dede 织梦 如何在主页添加用户登录
« 上一篇 2025-12-02
dede ddimg width配置如何修改?
下一篇 » 2025-12-02

相关文章

取消
微信二维码
支付宝二维码

目录[+]