C 文件 I/O:创建、打开、读取、写入和关闭文件
C 文件管理
文件可用于存储大量持久数据。像许多其他语言一样,“C”提供以下文件管理功能,
- 创建文件
- 打开文件
- 读取文件
- 写入文件
- 关闭文件
以下是“C”中可用的最重要的文件管理功能,
在本教程中,您将学习-
- 如何创建文件
- 如何关闭文件:
- 写入文件
- fputc() 功能:
- fputs() 功能:
- fprintf()函数:
- 从文件中读取数据
- 使用 getc 和 putc 进行交互式文件读写
如何创建文件
每当您想使用文件时,第一步就是创建一个文件。文件不过是内存中存储数据的空间。
要使用以下语法在“C”程序中创建文件,
FILE *fp; fp = fopen ("file_name", "mode");
在上述语法中,文件是标准库中定义的数据结构。
fopen 是一个标准函数,用于打开文件。
- 如果系统上不存在该文件,则创建并打开该文件。
- 如果系统中已经存在文件,则直接使用此函数打开。
fp 是指向文件类型的文件指针。
每当您打开或创建文件时,您都必须指定您要对文件执行的操作。可以创建或打开“C”编程中的文件以用于读/写目的。模式用于指定是否要出于以下任何目的打开文件。以下是“C”编程中可以在处理文件时使用的不同类型的模式。
追加模式打开文件。如果文件处于附加模式,则打开该文件。文件内容不变。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(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; }
输出:
上述程序将单个字符写入 fputc_test.txt 文件,直到它到达下一行符号“\n”,这表明该句子已成功写入。过程就是把数组的每个字符都取出来写入文件。
- 在上面的程序中,我们创建并以写入模式打开了一个名为 fputc_test.txt 的文件,并声明了我们将写入该文件的字符串。
- 我们使用 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); }
输出:
- 在上述程序中,我们创建并以写入模式打开了一个名为 fputs_test.txt 的文件。
- 在我们使用 fputs() 函数通过写入三个不同的字符串进行写入操作之后
- 然后使用 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; }
输出:
- 在上面的程序中,我们创建并以写入模式打开了一个名为 fprintf_test.txt 的文件。
- 使用 fprintf() 函数通过写入字符串执行写入操作后,使用 fclose 函数关闭文件。
从文件中读取数据
有三种不同的函数专门用于从文件中读取数据
- fgetc(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
- 在上述程序中,我们打开了之前使用 fprintf() 函数编写的名为“fprintf_test.txt”的文件,其中包含“Learning C with Guru99”字符串。我们使用 fgets() 函数读取它,该函数逐行读取,其中缓冲区大小必须足以处理整行。
- 我们重新打开文件以将指针文件重置为指向文件的开头。创建各种字符串变量来分别处理每个单词。打印变量以查看其内容。 fscanf() 主要用于从文件中提取和解析数据。
- 重新打开文件以将指针文件重置为指向文件的开头。使用 getc() 函数从文件中读取数据并逐字符打印,直到遇到 EOF 语句
- 在使用不同的变体执行读取操作文件后,我们再次使用 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; }
输出:
- 在上面的程序中,我们创建并以写入模式打开了一个名为 demo 的文件。
- 执行写操作后,使用 fclose 函数关闭文件。
- 我们再次以读取模式打开了一个包含数据的文件。将执行一个while循环,直到找到eof。一旦找到文件末尾,操作将终止,并使用 printf 函数显示数据。
- 执行读取操作后文件再次使用 fclose 函数关闭。
总结
- 文件是内存中存储数据的空间。
- “C”编程提供了各种处理文件的函数。
- 操作文件的机制称为文件管理。
- 在对文件执行操作之前,必须先打开文件。
- 文件可以以读取、写入或追加模式打开。
- Getc 和 putc 函数用于读取和写入单个字符。
- 函数 fscanf() 允许从文件中读取和解析数据
- 我们可以阅读(使用getc 函数)通过循环覆盖所有文件直到遇到 EOF 来覆盖整个文件
- 我们可以在创建文件名后写入文件,使用函数 fprintf() 并且它必须在字符串文本的末尾有换行符。
C语言