C 文件 I/O:创建、打开、读取、写入和关闭文件
C 文件管理
文件可用于存储大量持久数据。与许多其他语言一样,“C”提供了以下文件管理函数:
- 创建文件
- 打开文件
- 读取文件
- 写入文件
- 关闭文件
以下是“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"); }
输出
文件在保存代码的同一文件夹中创建。
您可以指定要创建文件的路径。
#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):返回 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 代表 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; }
输出
- 在上述程序中,我们已以写入模式创建并打开了一个名为 demo 的文件。
- 写入操作执行后,然后使用 fclose 函数关闭文件。
- 我们再次打开了一个现在包含数据的读取模式的文件。while 循环将执行直到找到 eof。一旦找到文件末尾,操作将终止,并且数据将使用 printf 函数显示。
- 执行完文件读取操作后,再次使用 fclose 函数关闭文件。
摘要
- 文件是存储数据的内存空间。
- C 编程提供了各种函数来处理文件。
- 操纵文件的机制称为文件管理。
- 在进行文件操作之前必须打开文件。
- 文件可以以读取、写入或追加模式打开。
- Getc 和 putc 函数用于读取和写入单个字符。
- fscanf() 函数允许从文件中读取和解析数据。
- 我们可以通过循环读取(使用 **getc** 函数)整个文件,直到遇到 EOF。
- 在创建文件名后,我们可以使用 **fprintf()** 函数向文件写入内容,并且字符串文本末尾必须有换行符。