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()** 函数向文件写入内容,并且字符串文本末尾必须有换行符。











