首页 > 编程笔记 > C语言笔记 阅读:12

C语言写入文件(fprintf()、fputc()和fputs())

C语言有多种函数可以用于将数据写入文件中。

C语言 fprintf()函数

在 C语言中,fprintf() 是一个用于将格式化的输出写入指定文件中的库函数,该函数在<stdio.h>头文件中。

与 printf() 函数类似,fprintf() 函数也可以使用格式字符串和参数列表,但它会将格式化后的字符串写入一个 FILE 指针指向的文件中,而不是输出到屏幕上。

fprintf() 函数的使用方法和 printf() 函数非常类似,相当于在 printf() 函数的第一个参数前加了一个文件结构指针参数,用于指明操作哪个文件。

fprintf() 函数的语法格式如下:
int fprintf (FILE * stream, const char * 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);
参数说明:
返回值:
例如,使用 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);
参数说明:
返回值:
例如:
#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() 函数之后,文件内容会出现。

相关文章