C语言写入文件(fprintf()、fputc()和fputs())
C语言有多种函数可以用于将数据写入文件中。
与 printf() 函数类似,fprintf() 函数也可以使用格式字符串和参数列表,但它会将格式化后的字符串写入一个 FILE 指针指向的文件中,而不是输出到屏幕上。
fprintf() 函数的使用方法和 printf() 函数非常类似,相当于在 printf() 函数的第一个参数前加了一个文件结构指针参数,用于指明操作哪个文件。
fprintf() 函数的语法格式如下:
以下代码展示了如何使用 fprintf() 函数将数据输出到文件中:

图 1 输出数据到文件中
fputc() 函数的原型如下:
返回值:
例如,使用 fputc() 函数实现如下需求:使用指针 p 遍历"HelloWorld\n"字符串,直到指针指向的字符为'\0'。在遍历过程中的每个字符,都被 fputc() 函数写入文件中。

图 2 成功写入 HelloWorld 字符串
我们如果想在第一行之后再增加更多的"Hello World",那么再次运行上面的程序是否可行?答案是否定的,因为 fopen() 函数使用的是"w"写入模式,它会将文件清空再进行写入。
为了保留原有内容,并继续在文件尾部添加新内容,我们需要使用追加模式 a。a 代表单词 append 的首字母:

图 3 多行HelloWorld
注意,代码从未将 '\0' 写入文件中,文件中的每一行都由换行符进行分隔。此外,'\0' 并不标记文件结尾。我们可以通过文件操作函数的返回值和 feof() 函数的返回值来判断文件是否已到达结尾。
fputs() 函数将一个以空字符('\0')结尾的字符串写入一个 FILE 指针指向的文件中。fputs() 函数的原型如下:
返回值:
例如:

图 4 写入五行 Have a good time
现在,我们来观察一个有趣的现象。在上面程序的基础上,在关闭文件前添加 system("pause") 代码,让程序在这个地方暂停一下:
我们会发现,在暂停之前,写入数据的 fputs(str, pFile)语句已经执行完毕。然而,当我们打开文件 data.txt 时,文件内却没有任何内容。
按任意键让程序继续运行,暂停结束后,文件内出现了内容,如下图所示:
为了解释上述现象,我们需要了解 C语言中提供的文件操作函数是带有缓存的,数据首先被写入缓存中。当缓存中的数据积累到一定数量时,数据会被一起写入文件中。因此,在刚刚暂停时,数据仍然在缓存区内,尚未被写入文件中。
只有当缓存区的数据被写入文件中时,数据才真正被保存在文件中。此时,缓存区的数据将被清空,这个过程被称为刷新缓存。
当文件被关闭或程序结束时,缓存会被刷新。因此,在调用 fclose() 函数之后,文件内容会出现。
C语言 fprintf()函数
在 C语言中,fprintf() 是一个用于将格式化的输出写入指定文件中的库函数,该函数在<stdio.h>
头文件中。与 printf() 函数类似,fprintf() 函数也可以使用格式字符串和参数列表,但它会将格式化后的字符串写入一个 FILE 指针指向的文件中,而不是输出到屏幕上。
fprintf() 函数的使用方法和 printf() 函数非常类似,相当于在 printf() 函数的第一个参数前加了一个文件结构指针参数,用于指明操作哪个文件。
fprintf() 函数的语法格式如下:
int fprintf (FILE * stream, const char * format, ...);参数说明:
- stream:一个指向 FILE 类型的指针,指示要写入数据的文件。fopen 函数通常用于打开文件并获取此指针。
- format:一个常量字符指针,指定格式字符串。格式字符串中可以包含普通字符和转换说明符,用于控制输出的格式。转换说明符以%符号开始,后跟一个或多个标志、宽度、精度和类型字符。
- ...:可变参数列表,与格式字符串中的转换说明符一一对应。根据转换说明符的类型,传入相应的参数。
以下代码展示了如何使用 fprintf() 函数将数据输出到文件中:
#include <stdio.h> int main() { FILE* pFile = fopen("data.txt", "w"); if (pFile == NULL) { return -1; } int n = 123; double f = 3.1415; char ch = 'A'; fprintf()(pFile, "%d\n", n); fprintf()(pFile, "%f\n", f); fprintf()(pFile, "%c\n", ch); fclose(pFile); return 0; }其中 pFile 就是我们之前创建的文件的指针。运行程序之后,可以得到如下图所示的文件。

图 1 输出数据到文件中
C语言fputc()函数
在 C语言中,fputc() 是一个用于向文件中写入单个字符的库函数,该函数在 <stdio.h> 头文件中。fputc() 函数将一个字符(以整数形式表示的 ASCII 码)写入一个 FILE 指针指向的文件中。fputc() 函数的原型如下:
int fputc (int ch, FILE * stream);参数说明:
- ch:要写入文件中的字符。fputc() 函数通常以整数形式传递字符的ASCII码。
- stream:一个指向 FILE 类型的指针,指示要写入字符的文件。fopen() 函数通常用于打开文件并获取此指针。
返回值:
- 成功:返回写入的字符的 ASCII 码。
- 失败:返回 EOF。
例如,使用 fputc() 函数实现如下需求:使用指针 p 遍历"HelloWorld\n"字符串,直到指针指向的字符为'\0'。在遍历过程中的每个字符,都被 fputc() 函数写入文件中。
#include <stdio.h> int main() { FILE* pFile = fopen("data.txt", "w"); // 写模式 if (pFile == NULL) { return -1; } char str[] = "HelloWorld\n"; char *p = str; while (*p != '\0') { // 向文件中写入一个字符 fputc(*p, pFile); p++; } fclose(pFile); return 0; }运行程序后,文件 data.txt 成功写入了 HelloWorld 字符串,如下图所示:

图 2 成功写入 HelloWorld 字符串
我们如果想在第一行之后再增加更多的"Hello World",那么再次运行上面的程序是否可行?答案是否定的,因为 fopen() 函数使用的是"w"写入模式,它会将文件清空再进行写入。
为了保留原有内容,并继续在文件尾部添加新内容,我们需要使用追加模式 a。a 代表单词 append 的首字母:
#include <stdio.h> int main() { FILE* pFile = fopen("data.txt", "a"); // 追加模式 if (pFile == NULL) { return -1; } char str[] = "HelloWorld\n"; char *p = str; while (*p != '\0') { // 向文件中写入一个字符 fputc(*p, pFile); p++; } fclose(pFile); return 0; }多次运行程序,你会发现文件中有了多行 HelloWorld,如下图所示:

图 3 多行HelloWorld
注意,代码从未将 '\0' 写入文件中,文件中的每一行都由换行符进行分隔。此外,'\0' 并不标记文件结尾。我们可以通过文件操作函数的返回值和 feof() 函数的返回值来判断文件是否已到达结尾。
C语言fputs()函数
在 C语言中,fputs() 是一个用于向文件中写入字符串的库函数,该函数在<stdio.h>头文件中。fputs() 函数将一个以空字符('\0')结尾的字符串写入一个 FILE 指针指向的文件中。fputs() 函数的原型如下:
int fputs (const char * str, FILE * stream);参数说明:
- str:一个指向以空字符结尾的字符串的常量字符指针。
- stream:一个指向 FILE 类型的指针,指示要写入字符串的文件。fopen() 函数通常用于打开文件并获取此指针。
返回值:
- 成功:返回一个非负值。
- 失败:返回 EOF。
例如:
#include <stdio.h> int main() { FILE* pFile = fopen("data.txt", "w"); if (pFile == NULL) { return -1; } char str[] = "Have a good time\n"; for(int i = 0; i < 5; i++) { // 向文件中写入五行"Have a good time\n" fputs(str, pFile); } fclose(pFile); return 0; }运行结果如下图所示,文件成功写入了五行 Have a good time。

图 4 写入五行 Have a good time
现在,我们来观察一个有趣的现象。在上面程序的基础上,在关闭文件前添加 system("pause") 代码,让程序在这个地方暂停一下:
#include <stdio.h> #include <stdlib.h> int main() { FILE* pFile = fopen("data.txt", "w"); if (pFile == NULL) { return -1; } char str[] = "Have a good time\n"; for(int i = 0; i < 5; i++) { // 向文件中写入五行"Have a good time\n" fputs(str, pFile); } system("pause"); fclose(pFile); return 0; }运行代码后,程序确实在关闭文件前暂停了,如下图所示:

我们会发现,在暂停之前,写入数据的 fputs(str, pFile)语句已经执行完毕。然而,当我们打开文件 data.txt 时,文件内却没有任何内容。
按任意键让程序继续运行,暂停结束后,文件内出现了内容,如下图所示:

为了解释上述现象,我们需要了解 C语言中提供的文件操作函数是带有缓存的,数据首先被写入缓存中。当缓存中的数据积累到一定数量时,数据会被一起写入文件中。因此,在刚刚暂停时,数据仍然在缓存区内,尚未被写入文件中。
只有当缓存区的数据被写入文件中时,数据才真正被保存在文件中。此时,缓存区的数据将被清空,这个过程被称为刷新缓存。
当文件被关闭或程序结束时,缓存会被刷新。因此,在调用 fclose() 函数之后,文件内容会出现。