C 文件 I/O:创建、打开、读取、写入和关闭文件

C 文件管理

文件可用于存储大量持久数据。与许多其他语言一样,“C”提供了以下文件管理函数:

  1. 创建文件
  2. 打开文件
  3. 读取文件
  4. 写入文件
  5. 关闭文件

以下是“C”中提供的一些最重要的文件管理函数:

函数 目的
fopen () 创建文件或打开现有文件
fclose () 关闭文件
fprintf () 将数据块写入文件
fscanf () 从文件中读取数据块
getc () 从文件中读取单个字符
putc () 将单个字符写入文件
getw () 从文件中读取整数
putw () 将整数写入文件
fseek () 将文件指针的位置设置到指定位置
ftell () 返回文件指针的当前位置
rewind () 将文件指针设置到文件开头

如何创建文件

每当您想处理文件时,第一步是创建文件。文件不过是存储数据的内存空间。

在 C 程序中创建文件的语法如下:

FILE *fp;
fp = fopen ("file_name", "mode");

在上面的语法中,file 是在标准库中定义的数据结构。

fopen 是用于打开文件的标准函数。

  • 如果文件不在系统中,则会创建然后打开。
  • 如果文件已存在于系统中,则使用此函数直接打开。

fp 是指向类型文件的文件指针。

每当您打开或创建文件时,都必须指定您将如何处理该文件。C 编程中的文件可以为读/写目的创建或打开。模式用于指定您是否要为以下任一目的打开文件。以下是在处理文件时可以在 C 编程中使用文件模式的各种类型:

文件模式 描述
r 打开文件进行读取。如果文件处于读取模式,则不会删除数据(如果文件已存在于系统中)。
w 打开文件进行写入。如果文件处于写入模式,则会在文件不存在时创建一个新文件。如果文件已存在于系统中,则会截断文件中的所有数据,并以写入模式打开。
a
追加模式打开文件。如果文件处于追加模式,则会打开该文件。文件内的内容不会改变。
r+ 从头开始进行读写
w+ 读写文件,覆盖现有文件
a+ 读写文件,追加到文件

在给定的语法中,文件名和模式都作为字符串指定,因此它们必须始终用双引号括起来。

示例

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("data.txt", "w");
}

输出

文件在保存代码的同一文件夹中创建。

How to Create a File

您可以指定要创建文件的路径。

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

How to Create a File

如何关闭文件

完成文件操作后,应始终关闭文件。这意味着文件内容和链接将被终止。这可以防止文件被意外损坏。

“C”提供了 fclose 函数来执行文件关闭操作。fclose 的语法如下:

fclose (file_pointer);

示例

FILE *fp;
fp  = fopen ("data.txt", "r");
fclose (fp);

fclose 函数以文件指针作为参数。然后通过 fclose 函数关闭与文件指针关联的文件。如果关闭成功,则返回 0;如果文件关闭时发生错误,则返回 EOF(文件结束符)。

关闭文件后,同一个文件指针也可以用于其他文件。

在 C 编程中,程序终止时文件会自动关闭。通过编写 fclose 函数手动关闭文件是一种良好的编程实践。

写入文件

在 C 中,写入文件时必须显式添加换行符“\n”。

stdio 库提供了写入文件的必要函数。

  • fputc(char, file_pointer):将字符写入 file_pointer 指向的文件。
  • fputs(str, file_pointer):将字符串写入 file_pointer 指向的文件。
  • fprintf(file_pointer, str, variable_lists):将字符串打印到 file_pointer 指向的文件。字符串可以选择性地包含格式说明符和变量列表 variable_lists。

下面的程序演示了如何执行写入文件的操作。

fputc() 函数

#include <stdio.h>
int main() {
        int i;
        FILE * fptr;
        char fn[50];
        char str[] = "Guru99 Rocks\n";
        fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode"
        for (i = 0; str[i] != '\n'; i++) {
            /* write to file using fputc() function */
            fputc(str[i], fptr);
        }
        fclose(fptr);
        return 0;
    }

输出

Writing to a File

上述程序将单个字符写入 **fputc_test.txt** 文件,直到遇到换行符“\n”,这表明句子已成功写入。该过程是将数组中的每个字符取出并写入文件。

Writing to a File

  1. 在上述程序中,我们以写入模式创建并打开了一个名为 fputc_test.txt 的文件,并声明了将写入文件的字符串。
  2. 我们使用 for 循环执行逐字符写入操作,并将每个字符放入我们的文件中,直到遇到“\n”字符,然后使用 fclose 函数关闭文件。

fputs () 函数

#include <stdio.h>
int main() {
        FILE * fp;
        fp = fopen("fputs_test.txt", "w+");
        fputs("This is Guru99 Tutorial on fputs,", fp);
        fputs("We don't need to use for loop\n", fp);
        fputs("Easier than fputc function\n", fp);
        fclose(fp);
        return (0);
    }

输出

Writing to a File

Writing to a File

  1. 在上述程序中,我们已以写入模式创建并打开了一个名为 fputs_test.txt 的文件。
  2. 然后使用 fputs() 函数执行写入操作,写入三个不同的字符串
  3. 然后使用 fclose 函数关闭文件。

fprintf()函数

#include <stdio.h>
    int main() {
        FILE *fptr;
        fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode"
        /* write to file */
        fprintf(fptr, "Learning C with Guru99\n");
        fclose(fptr);
        return 0;
    }

输出

Writing to a File

Writing to a File

  1. 在上述程序中,我们已以写入模式创建并打开了一个名为 fprintf_test.txt 的文件。
  2. 使用 fprintf() 函数写入字符串后,然后使用 fclose 函数关闭文件。

从文件中读取数据

有三个不同的函数专门用于从文件中读取数据:

  • fgetc(file_pointer):返回 file_pointer 指向的文件的下一个字符。当到达文件末尾时,将返回 EOF。
  • fgets(buffer, n, file_pointer):读取文件中的 n-1 个字符,并将字符串存储在缓冲区中,该缓冲区最后附加 NULL 字符 ‘\0’。
  • fscanf(file_pointer, conversion_specifiers, variable_adresses):用于解析和分析数据。它从文件中读取字符,并使用转换说明符将输入分配给变量指针 variable_adresses 的列表。请记住,与 scanf 一样,fscanf 在遇到空格或换行符时会停止读取字符串。

以下程序分别使用 fgets()、fscanf() 和 fgetc() 函数演示了从 fputs_test.txt 文件中读取数据。

#include <stdio.h>
int main() {
        FILE * file_pointer;
        char buffer[30], c;

        file_pointer = fopen("fprintf_test.txt", "r");
        printf("----read a line----\n");
        fgets(buffer, 50, file_pointer);
        printf("%s\n", buffer);

        printf("----read and parse data----\n");
        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        char str1[10], str2[2], str3[20], str4[2];
        fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4);
        printf("Read String1 |%s|\n", str1);
        printf("Read String2 |%s|\n", str2);
        printf("Read String3 |%s|\n", str3);
        printf("Read String4 |%s|\n", str4);

        printf("----read the entire file----\n");

        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        while ((c = getc(file_pointer)) != EOF) printf("%c", c);

        fclose(file_pointer);
        return 0;
    }

结果

----read a line----
Learning C with Guru99

----read and parse data----
Read String1 |Learning|
Read String2 |C|
Read String3 |with|
Read String4 |Guru99|
----read the entire file----
Learning C with Guru99

Reading data from a File

  1. 在上述程序中,我们打开了之前用 fprintf() 函数写入的名为“fprintf_test.txt”的文件,其中包含“Learning C with Guru99”字符串。我们使用 fgets() 函数逐行读取,其中缓冲区大小必须足以处理整行。
  2. 我们重新打开文件以将文件指针重置到文件开头。创建各种字符串变量以单独处理每个单词。打印变量以查看其内容。fscanf() 主要用于从文件中提取和解析数据。
  3. 重新打开文件以将文件指针重置到文件开头。使用 getc() 函数逐个字符地从文件中读取并打印数据,直到遇到 EOF 语句。
  4. 在通过不同变体执行完文件读取操作后,我们再次使用 fclose 函数关闭文件。

使用 getc 和 putc 进行交互式文件读写

这些是最简单的文件操作。Getc 代表 get character(获取字符),putc 代表 put character(放置字符)。这两个函数一次只能处理一个字符。

以下程序演示了 C 编程中的文件处理函数。

#include <stdio.h>
int main() {
        FILE * fp;
        char c;
        printf("File Handling\n");
        //open a file
        fp = fopen("demo.txt", "w");
        //writing operation
        while ((c = getchar()) != EOF) {
            putc(c, fp);
        }
        //close file
        fclose(fp);
        printf("Data Entered:\n");
        //reading
        fp = fopen("demo.txt", "r");
        while ((c = getc(fp)) != EOF) {
            printf("%c", c);
        }
        fclose(fp);
        return 0;
    }

输出

Interactive File Read and Write with getc and putc

Interactive File Read and Write with getc and putc

  1. 在上述程序中,我们已以写入模式创建并打开了一个名为 demo 的文件。
  2. 写入操作执行后,然后使用 fclose 函数关闭文件。
  3. 我们再次打开了一个现在包含数据的读取模式的文件。while 循环将执行直到找到 eof。一旦找到文件末尾,操作将终止,并且数据将使用 printf 函数显示。
  4. 执行完文件读取操作后,再次使用 fclose 函数关闭文件。

摘要

  • 文件是存储数据的内存空间。
  • C 编程提供了各种函数来处理文件。
  • 操纵文件的机制称为文件管理。
  • 在进行文件操作之前必须打开文件。
  • 文件可以以读取、写入或追加模式打开。
  • Getc 和 putc 函数用于读取和写入单个字符。
  • fscanf() 函数允许从文件中读取和解析数据。
  • 我们可以通过循环读取(使用 **getc** 函数)整个文件,直到遇到 EOF。
  • 在创建文件名后,我们可以使用 **fprintf()** 函数向文件写入内容,并且字符串文本末尾必须有换行符。