C 文件 I/O:创建、打开、读取、写入和关闭文件
C 文件管理
文件可用于存储大量持久数据。与许多其他语言一样,“C”提供以下文件管理功能,
- 创建文件
- 打开文件
- 读取文件
- 写入文件
- 关闭文件
以下是“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”,表示该句子写入成功。这个过程就是取出数组中的每个字符并将其写入文件。
- 在上面的程序中,我们以写入模式创建并打开了一个名为 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 (文件指针): 它返回文件指针指向的文件中的下一个字符。当到达文件末尾时,将返回 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
- 在上面的程序中,我们打开了之前使用 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() 允许从文件中读取和解析数据
- 我们可以读取(使用 盖茨 函数)通过循环覆盖整个文件,直到遇到 EOF
- 我们可以在创建文件名称后,使用函数写入文件 打印函数() 并且字符串文本末尾必须有换行符。