文件可用于存储大量持久性数据。 与许多其他语言一样,“ 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;
}
定义字符串的数组大小时,其空间大小一定要比字符串多出一位。




