C 语言 fprintf() 和 fwrite() 函数的区别

2025年5月11日 | 阅读 7 分钟

fprintf() 函数旨在通过将数据转换为人类可读的字符串格式来将格式化文本写入文件,这使其非常适合与文本文件一起使用。相反,fwrite() 函数将内存中的原始二进制数据写入文件而不进行格式化,这使其更适合二进制文件。虽然 fprintf() 提供了格式化选项,但 fwrite() 为性能关键型应用程序提供了更快、未经格式化的数据传输。在本文中,我们将讨论 C 语言中 fprintf() 和 fwrite() 函数的区别。在讨论它们之间的区别之前,我们必须了解 C 语言中 fprintf() 和 fwrite() 函数的语法、参数、主要功能和示例。

什么是 fprintf()?

C 语言中的 fprintf() 函数用于将格式化输出打印到指定的文件流,这使我们能够以受控且易于理解的方式将结构化数据写入文件。此方法使我们能够在写入数据之前对其进行格式化。当创建需要特定格式以确保一致性和清晰度的报告、日志或结构化文本文件时,它非常有用。

文件格式化打印:它意味着“将格式化输出打印到文件”。该函数接受一个文件指针(指向已打开的文件流),并使用我们指定的格式字符串准备数据,然后将输出直接写入该文件。我们可以使用 %d、%s、%f 等标准格式说明符来打印整数、字符串、浮点数等。

语法

参数

  • FILE *stream:指向将写入格式化输出的文件的指针。文件必须以可写模式(例如“w”、“a”或“r+”)打开。
  • const char *format:一个格式字符串,指示未来参数(如果有)将如何格式化。格式说明符(例如 %d、%s)可用于控制写入值的格式,此外还可以使用常规字符。
  • (可选参数):这些是我们希望按照格式字符串格式化后写入文件的值。

返回值

fprintf() 函数成功时返回写入文件的字符数(不包括空终止符),失败时返回负整数。

主要特点

fprintf() 函数的几个主要功能如下:

  1. 格式化输出:fprintf 的主要功能是其格式化数据的能力,它允许将变量动态地插入到文本输出中。我们可以指定整数、浮点数和文本等数据类型如何在文件中表示。
  2. 灵活的文件写入:fprintf() 函数适用于任何已打开的文件流,而不仅仅是文本文件。fprintf() 函数可以写入任何以可写模式(例如“w”、“a”或“r+”)打开的文件。
  3. 错误处理:如果文件无法打开或写入过程中出现错误,fprintf() 函数将返回负值,允许程序员正确发现和处理错误。
  4. 用于日志文件和报告:fprintf() 函数广泛用于结构化日志记录和报告。其格式化数据的能力使其非常适合生成人类可读的文本文件或结构化数据。
  5. 文件指针管理:请记住使用 fclose() 函数关闭文件,因为保持文件打开可能会导致内存泄漏或文件锁定问题。

示例

让我们举一个例子来说明 C 语言中的 fprintf() 函数。

输出

 
File contents:
Name: John Doe
Age: 25
Height: 5.90

Name: Jane Smith
Age: 30
Height: 5.50

Name: Alice Johnson
Age: 22
Height: 5.70

Name: Bob Brown
Age: 27
Height: 6.10   

说明

该代码使用 fprintf() 函数将格式化数据写入文件 (output.txt),然后再次读取以进行验证。它首先以写入模式打开文件,然后使用循环和 writeToFile() 函数写入带有姓名、年龄和身高条目的文件。关闭文件后,它会重新打开文件以逐个字符地读取其内容,并将其输出到控制台。文件打开和读取操作都包括错误处理。

什么是 fwrite() 函数?

C 语言中的 fwrite() 函数用于将数据写入给定的文件流。它允许以各种方式将二进制或原始数据写入文件,这使其在处理非文本数据(包括图像、音频文件和自定义数据结构)时特别有用。与 fprintf() 和 fputs() 等基于文本的过程不同,fwrite() 以字节为单位精确地写入内存中存储的数据。此功能可确保没有编码或换行符转换,从而允许数据保留其原始格式。

语法

它具有以下语法:

参数

  • buffer:包含要写入的数据的内存块的引用。它可以指向基本数据类型、数组或结构。
  • size:要从缓冲区写入的每个元素的大小(以字节为单位)。例如,对于整数,通常使用 sizeof(int)。
  • count:要从缓冲区写入的元素数量。
  • stream:指向 FILE 对象的指针,该对象指定将写入数据的目标文件流。此流必须以写入模式(例如 wb 或 ab)打开。

返回值

它返回成功写入的元素数量,如果发生错误或文件已到达末尾,则该数量可能小于 count。如果此数字小于 count,您可以使用 ferror() 来检查是否发生了错误。

主要特点

C 语言中的 fwrite() 函数的几个主要功能如下:

  1. 二进制数据处理:以字节为单位写入原始字节,不进行转换。
  2. 效率:它非常适合需要大量数据传输的高性能应用程序。
  3. 灵活性:它支持多种数据类型,包括数组和结构。

示例

让我们举一个例子来说明 C 语言中的 fwrite() 函数。

输出

 
Data successfully written to the file.   

说明

此 C 程序演示了如何使用 fwrite() 函数将整数数组写入二进制文件。它首先以二进制写入模式 (wb) 打开文件 output.bin,并检查是否成功打开。然后,使用 fwrite() 方法将数据数组中的所有五个整数写入文件,并进行错误处理以确保过程成功。最后,使用 fclose() 关闭文件以释放系统资源。

C 语言中 fprintf() 和 fwrite() 函数之间的主要区别

C 语言中的 fprintf() 和 fwrite() 函数之间存在几个主要区别。一些主要区别如下:

特性fprintf()fwrite()
目的它将格式化文本数据写入文件或输出流。它将原始二进制数据写入文件或输出流。
数据处理它将数据转换为人类可读的字符串格式。它以原始、未格式化的二进制形式写入数据。
文件模式它通常与文本模式(如 w、a、r+)一起使用。它通常与二进制模式(如 wb、ab、rb+)一起使用。
使用场景它非常适合写入结构化文本,例如日志或报告。它适合写入原始数据,例如数组或结构。
数据转换它执行数据格式化和换行符转换(例如,在 Windows 上将 \n 转换为 \r\n)。它写入内存中的数据,不做任何修改。
参数它接受格式字符串和相应的参数。它接受缓冲区、元素大小和元素计数。
返回值它返回写入的字符数。它返回成功写入的元素数量。
读取配对通常与 fscanf() 配对以进行格式化输入。通常与 fread() 配对以进行二进制输入。

结论

总之,在 fprintf()fwrite() 之间进行选择取决于文件类型和要处理的数据。使用 fprintf() 将格式化的、人类可读的文本写入文本文件,使用 fwrite() 将原始的、未格式化的二进制数据写入二进制文件。理解它们的区别可以确保 C 语言编程中的文件操作高效且适当。