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

C 文件管理

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

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

以下是“C”中最重要的文件管理函数,

function 目的
开张() 创建文件或打开现有文件
关闭函数 关闭文件
fprintf() 将数据块写入文件
fscanf()函数 从文件读取块数据
获取函数 从文件中读取单个字符
放出() 将单个字符写入文件
获取 () 从文件读取一个整数
putw() 复制代码 将整数写入文件
查找 () 将文件指针的位置设置为指定位置
ftell() 返回文件指针的当前位置
倒回 () 将文件指针设置在文件开头

如何创建文件

每当你想要操作一个文件时,第一步就是创建一个文件。文件只不过是内存中存储数据的空间。

要在“C”程序中创建文件,请使用以下语法,

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

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

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

  • 如果系统中不存在该文件,则创建该文件然后打开它。
  • 如果文件已存在于系统中,则直接使用此文件打开 function.

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

无论何时打开或创建文件,您都必须指定要对文件执行的操作。在“C”语言编程中,可以创建或打开文件以进行读取/写入。模式用于指定是否要为以下任何目的打开文件。以下是“C”语言编程中可用于处理文件的不同类型的模式。

文件模式 描述
r 打开文件进行读取。如果文件处于读取模式,则如果文件已存在于系统中,则不会删除任何数据。
w 打开文件进行写入。如果文件处于写入模式,则如果文件根本不存在,则创建一个新文件。如果文件已存在于系统中,则文件内的所有数据都将被截断,并打开文件进行写入。
a 打开一个文件
追加模式。如果文件处于追加模式,则文件被打开。文件内的内容不会改变。
r+ 从一开始就开放以供读写
w+ 打开以进行读写,覆盖文件
a+ 打开以进行读写,附加到文件

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

计费示例:

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

输出:

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

如何创建文件

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

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

如何创建文件

如何关闭文件

当文件操作结束时,应始终关闭文件。这意味着文件的内容和链接已终止。这可防止文件意外损坏。

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(字符,文件指针):将一个字符写入file_pointer指向的文件。
  • fputs(str,文件指针):它将字符串写入file_pointer指向的文件。
  • fprintf(文件指针, str,变量列表):它将一个字符串打印到 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;
    }

输出:

写入文件

上述程序将一个字符写入 fputc_测试.txt 直到到达下一行符号“\n”,表示该句子写入成功。这个过程就是取出数组中的每个字符并将其写入文件。

写入文件

  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);
    }

输出:

写入文件

写入文件

  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;
    }

输出:

写入文件

写入文件

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

从文件读取数据

有三种不同的函数专用于从文件读取数据

  • fgetc (文件指针): 它返回文件指针指向的文件中的下一个字符。当到达文件末尾时,将返回 EOF。
  • fgets(缓冲区,n,文件指针): 它从文件中读取 n-1 个字符并将字符串存储在缓冲区中,其中空字符 '\0' 作为最后一个字符附加。
  • fscanf(文件指针,转换说明符,变量地址):用于解析和分析数据。它从文件中读取字符,并将输入分配给 变量指针 使用转换说明符的变量地址。请记住,与 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

从文件读取数据

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

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

这些是最简单的文件操作。getc 代表获取字符,putc 代表放置字符。这两个函数每次只用于处理一个字符。

以下程序演示了 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;
    }

输出:

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

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

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

结语

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