Menu Close

C语言的文件管理

文件可用于存储大量持久性数据。 与许多其他语言一样,“ 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;
    }

定义字符串的数组大小时,其空间大小一定要比字符串多出一位。