文件可用于存储大量持久性数据。 与许多其他语言一样,“ C”提供了以下文件管理功能,
创建文件
打开文件
读取文件
写入文件
关闭文件
C语言文件管理函数列表
function (函数) | purpose (功能) |
fopen () | 产生或打开一个文件 |
fclose () | 管别文件 |
fprintf () | 写一堆数据给文件 |
fscanf () | 从文件读取一堆数据 |
getc () | 从文件读取一个字符 |
putc () | 向文件写入一个字符 |
getw () | 从文件读取一个整数 |
putw () | 向文件写入一个整数 |
fseek () | 把文件内指针指向特定位置 |
ftell () | 告诉文件内指针位置 |
rewind () | 把文件内指针指向文件开始 |
如何产生文件
每当您要使用文件时,第一步就是创建文件。 文件不过是存储数据的内存中的空间。
要使用以下语法在“ C”程序中创建文件,
FILE *fp; fp = fopen ("file_name", "mode");
用以上语法,文件是在标准库中定义的数据结构。
fopen是用于打开文件的标准功能:
- 如果系统上不存在该文件,则将创建该文件,然后将其打开。
- 如果系统上已经存在文件,则可以使用此功能直接将其打开。
fp是指向类型文件的文件指针。
每当您打开或创建文件时,都必须指定要处理的文件。 可以创建或打开“ C”语言中的文件以用于读/写目的。
mode(模式)用于指定您是否要出于以下任何目的打开文件。 以下是“ C”编程中不同类型的模式,可在处理文件时可以使用如下模式:
在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:
模式 | 描述 |
---|---|
r | 打开一个已有的文本文件,允许读取文件。 |
w | 打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。 |
a | 打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。 |
r+ | 打开一个文本文件,允许从开始读写文件。 |
w+ | 打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。 |
a+ | 打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。 |
r – read
w – write
a – append
在上述语法中,文件名和模式指定为字符串,因此必须始终将其用双引号引起来。
#include <stdio.h> int main() { FILE *fp; fp = fopen ("data.txt", "w"); }
运行结果在程序的同一个目录下产生了data.txt文件。
也可以声明文件data.txt产生的位置。例如:
#include <stdio.h> int main() { FILE *fp; fp = fopen (""C://0c/classes/data.txt"", "w"); }
关闭文件
每当对文件的操作结束时,应始终关闭文件。 这意味着内容和指向文件的链接已终止。 这样可以防止意外损坏文件。
‘C’提供了fclose函数来执行文件关闭操作。 fclose的语法如下:
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。
下面的程序显示了如何执行文件写入:
#include <stdio.h> int main() { int i; FILE * fptr; char fn[50]; char str[] = "riscV 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”,这表明该句子已成功写入。 该过程是获取数组的每个字符并将其写入文件。
以上示例中,利用fopen函数产生文件fputc_test.txt,并进入写入模式。然后利用fputc写入内容。利用fclose关闭文件指针。
如何写入文件
fputs(str,file_pointer):将字符串写入file_pointer指向的文件
示范:
#include <stdio.h> int main() { FILE * fp; fp = fopen("fputs_test.txt", "w+"); fputs("This is C Language 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); }
以上示例中,利用fopen函数产生文件fputs_test.txt,并进入写入模式。然后利用fputs写入内容。利用fclose关闭文件指针。
fprintf()Function 写一堆数据给文件
#include <stdio.h> int main() { FILE *fptr; fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode" /* write to file */ fprintf(fptr, "Our FPGA boards are best for FPGA education\n"); fclose(fptr); return 0; }
以上示例中,利用fopen函数产生文件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会停止读取字符串。
请看下面示例:
#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[4], str2[5], str3[7], str4[4], str5[5], str6[4], str7[5], str8[10] ; fscanf(file_pointer, "%s %s %s %s %s %s %s %s", str1, str2, str3, str4, str5, str6, str7, str8); 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 String5 |%s|\n", str5); printf("Read String6 |%s|\n", str6); printf("Read String7 |%s|\n", str7); printf("Read String8 |%s|\n", str8); 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; }
定义字符串的数组大小时,其空间大小一定要比字符串多出一位。