file 订阅
File,英文单词,名词、及物动词、不及物动词,作名词时意为“文件;档案;文件夹;锉刀,人名;(匈、塞)菲莱”,作及物动词时意为“提出;锉;琢磨;把…归档”,作不及物动词时意为“列队行进;用锉刀锉”。 展开全文
File,英文单词,名词、及物动词、不及物动词,作名词时意为“文件;档案;文件夹;锉刀,人名;(匈、塞)菲莱”,作及物动词时意为“提出;锉;琢磨;把…归档”,作不及物动词时意为“列队行进;用锉刀锉”。
信息
外文名
File
英式音标
[faɪl]
词    性
名词、及物动词、不及物动词
美式音标
[faɪl]
File短语搭配
file system [计] 文件系统 ; 档案系统 ; 文件体系 ; 文件编制file server 文件服务器 ; 档案伺服器 ; 档案服务器 ; 文件服务程序log file 日志文件 ; 访客流量统计文件 ; 记录档 ; 记录文件register file 寄存器堆 ; [计] 寄存器文件 ; 寄存器组File Explorer 文件资源管理器 ; 文件管理器 ; 文件浏览器 ; 资源管理器Source file [计] 源文件 ; 来源文件 ; 来源档案temporary file [计] 临时文件 ; 暂存文件 ; 暂时档案nail file 指甲锉 ; 指甲锉刀inverted file 倒排文件 ; [计] 倒置文件 ; 倒向文件 ; 倒排文档 [1] 
收起全文
精华内容
参与话题
问答
  • C语言文件操作

    千次阅读 多人点赞 2017-09-09 00:34:10
    C语言文件操作一、文件的打开与关闭 使用 fopen 打开文件FILE *file; file = fopen("文件名","文件使用方式"); 文件的打开方式 文件使用方式 解释 r 只读。若文件不存在返回空指针 w 只写。若文件存在,则删除...

    C语言文件操作

    一、文件的打开与关闭

    1. 使用 fopen 打开文件

      FILE *file;
      file = fopen("文件名","文件使用方式");
    2. 文件的打开方式

      文件使用方式 解释
      r 只读。若文件不存在返回空指针
      w 只写。若文件存在,则删除其内容,否则创建一个新文件
      a 追加。若文件不存在,则创建一个新文件
      r+ 读写。指定的文件必须已存在,否则返回NULL
      w+ 读写。若指定的文件已存在,则其中的内容被删去
      a+ 读写。追加写

      如果在后面附加 ”b“ ,则表示打开的是二进制文件。

    3. 使用 fclose 关闭文件

      fclose(文件指针); 

    二、文件读写常用函数

    1. fgetc 函数
      从指定文件读入一个字符

      fgetc(文件指针);
    2. fread 函数

      从指定文件读入一组数据

      fread(buffer, size, count, file);

      buffer 存放读入数据的内存首地址

      size 每个数据项的字节数

      count 数据项个数

      file 文件类型的指针

    3. fscanf 函数

      从指定的文件中格式化读入数据。其一般形式为:

      fscanf(文件指针,格式控制,地址表);
    4. 读入例子

      
      #include<stdio.h>
      
      int main()
      {
         FILE *file;
         //1.dat 为 "Demo1"
         file = fopen("1.dat","r");
      
         char a;
         char b[3];
         int c;
      
         if(file != NULL){
             a = fgetc(file);
             fread(b,sizeof(char),3,file);
             fscanf(file,"%d",&c);
         }
      
         putchar(a);
         for(int i = 0; i < 3; i++){
             printf(" %c",b[i]);
         }
         printf(" %d",c);
      
         fclose(file);
         return 0;
      }
    5. fputc 函数

      将一个字符写到指定的文件中,若写成功返回以输出字符,否则返回 EOF

      fputc( int , FILE* );
    6. fwrite 函数

      将一组数据写到指定的文件中

      fwrite( buffer, size, count, file);

      buffer 输出数据的首地址

      size 每个数据项的字节数

      count 数据项个数

      file 文件类型的指针

    7. fprintf 函数

      格式化写数据到指定的文件中,形式为

      fprintf(文件指针,格式控制,输出表);
    8. 读写例子

      
      #include<stdio.h>
      
      int main()
      {
         FILE *file;
         //1.dat 为空
         file = fopen("1.dat","w+");
      
         char a0 = 'D';
         char b0[3] = {'e','m','o'};
         int c0 = 2;
         char a1;
         char b1[3];
         int c1;
      
         if(file != NULL){
             // 输出
             fputc(a0,file);
             fwrite(b0,sizeof(char),3,file);
             fprintf(file,"%d",c0);
             // 读写指针移动到文件开头
             rewind(file);
             // 读入
             a1 = fgetc(file);
             fread(b1,sizeof(char),3,file);
             fscanf(file,"%d",&c1);
         }
         // 打印结果
         putchar(a1);
         for(int i = 0; i < 3; i++){
             printf(" %c",b1[i]);
         }
         printf(" %d",c1);
      
         fclose(file);
         return 0;
      }
      

    三、文件的定位

    1. rewind 函数

      将文件的读写指针移动到文件的开头。

      rewind(文件指针);
    2. fseek 函数

      将文件的读写指针移动到文件的指定位置

      fseek(文件指针,偏移量,起始位置);

      偏移量的类型为长整型

      起始位置是指移动文件读写指针的参考位置,有以下三个值

      SEEK_SET 或 0 表示文件首

      SEEK_CUR 或 1 表示当前读写的位置

      SEEK_END 或 2 表示文件尾

    3. ftell 函数

      返回文件的当前读写位置,若出错返回(-1L)。其形式为

      ftell(文件指针);

    展开全文
  • C语言文件操作一

    千次阅读 多人点赞 2019-11-04 20:58:15
    C语言文件操作 在C语言中,操作文件之前必须先打开文件,所谓“打开文件”,就是让程序和文件建立连接的过程。 打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写...

    C语言文件操作介绍

    在C语言中,操作文件之前必须先打开文件,所谓“打开文件”,就是让程序和文件建立连接的过程。

    打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中,程序还可以记录当前读写到了哪个位置,下次可以在此基础上继续操作。

    使用 <stdio.h> 头文件中的 fopen() 函数即可打开文件,它的用法为:

    FILE *fopen(char *filename, char *mode);
    

    filename 为文件名(包括文件路径),mode为打开方式,它们都是字符串。

    fopen() 函数的返回值

    fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中,然后将该变量的地址返回。

    FILE 是 <stdio.h> 头文件中的一个结构体,它专门用来保存文件信息。我们不用关心 FILE 的具体结构,只需要知道它的用法就行。

    FILE *fp = fopen("demo.txt", "r");
    

    表示以“只读”方式打开当前目录下的 demo.txt 文件,并使 fp 指向该文件,这样就可以通过 fp 来操作 demo.txt 了。fp 通常被称为文件指针

    再来看一个例子:

    FILE *fp = fopen("D:\\demo.txt","rb+");
    

    表示以二进制方式打开 D 盘下的 demo.txt 文件,允许读和写。


    判断文件是否打开成功

    打开文件出错时,fopen() 将返回一个空指针,也就是 NULL,我们可以利用这一点来判断文件是否打开成功,请看下面的代码:

    FILE *fp;
    if( (fp=fopen("D:\\demo.txt","rb") == NULL ){
        printf("Fail to open file!\n");
        exit(0);  //退出程序(结束程序)
    }
    

    以上代码是文件操作的规范写法,读者在打开文件时一定要判断文件是否打开成功,因为一旦打开失败,后续操作就都没法进行了,往往以“结束程序”告终。
    在这里插入图片描述
    调用 fopen() 函数时必须指明读写权限,但是可以不指明读写方式(此时默认为"t")。

    读写权限和读写方式可以组合使用,但是必须将读写方式放在读写权限的中间或者尾部(换句话说,不能将读写方式放在读写权限的开头)。例如:

    将读写方式放在读写权限的末尾:“rb”、“wt”、“ab”、“r+b”、“w+t”、“a+t”
    将读写方式放在读写权限的中间:“rb+”、“wt+”、“ab+”


    关闭文件

    文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。

    fclose() 的用法为:

    int fclose(FILE *fp);
    

    fp 为文件指针。例如:
    fclose(fp);
    文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。

    通过一段代码来体会文件操作

    #include <stdio.h>
    #include <stdlib.h>
    #define N 100
    int main() {
        FILE *fp;
        char str[N + 1];
        //判断文件是否打开失败
        if ( (fp = fopen("d:\\demo.txt", "rt")) == NULL ) {
            puts("Fail to open file!");
            exit(0);
        }
        //循环读取文件的每一行数据
        while( fgets(str, N, fp) != NULL ) {
            printf("%s", str);
        }
       
        //操作结束后关闭文件
        fclose(fp);
        return 0;
    }
    

    对于 Windows 平台,为了保险起见,我们最好用"t"来打开文本文件,用"b"来打开二进制文件。对于 Linux 平台,使用"r"还是"b"都无所谓,既然默认是"r",那我们什么都不写就行了


    字符读取函数 fgetc与字符写入函数fputc

    fgetc() 的用法为:

    int fgetc (FILE *fp);
    

    fp 为文件指针。fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF。

    EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。fgetc() 的返回值类型之所以为 int,就是为了容纳这个负数(char不能是负数)。

    用法举例:

    char ch;
    FILE *fp = fopen("D:\\demo.txt", "r+");
    ch = fgetc(fp);
    

    在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。使用 fgetc() 函数后,该指针会向后移动一个字节,所以可以连续多次使用 fgetc() 读取多个字符。

    案例:

    
    #include<stdio.h>
    int main(){
        FILE *fp;
        char ch;
      
        //如果文件不存在,给出提示并退出
        if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){
            puts("Fail to open file!");
            exit(0);
        }
        //每次读取一个字节,直到读取完毕
        while( (ch=fgetc(fp)) != EOF ){
            putchar(ch);
        }
        putchar('\n');  //输出换行符
        if(ferror(fp)){
            puts("读取出错");
        }else{
            puts("读取成功");
        }
        fclose(fp);
        return 0;
    

    fputc() 的用法为:

    int fputc ( int ch, FILE *fp );
    

    ch 为要写入的字符,fp 为文件指针。fputc() 写入成功时返回写入的字符,失败时返回 EOF,返回值类型为 int 也是为了容纳这个负数。例如:
    fputc(‘a’, fp);
    或者:
    char ch = ‘a’;
    fputc(ch, fp);
    表示把字符 ‘a’ 写入fp所指向的文件中。


    fgets和fputs函数

    fgetc() 和 fputc() 函数每次只能读写一个字符,速度较慢;实际开发中往往是每次读写一个字符串或者一个数据块,这样能明显提高效率。

    读字符串函数 fgets
    fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的用法为:

    char *fgets ( char *str, int n, FILE *fp );
    

    str 为字符数组,n 为要读取的字符数目,fp 为文件指针。

    返回值:读取成功时返回字符数组首地址,也即 str;读取失败时返回 NULL;如果开始读取时文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回 NULL。

    注意,读取到的字符串会在末尾自动添加 ‘\0’,n 个字符也包括 ‘\0’。也就是说,实际只读取到了 n-1 个字符,如果希望读取 100 个字符,n 的值应该为 101

    需要重点说明的是,在读取到 n-1 个字符之前如果出现了换行,或者读到了文件末尾,则读取结束。这就意味着,不管 n 的值多大,fgets() 最多只能读取一行数据,不能跨行。在C语言中,没有按行读取文件的函数,我们可以借助 fgets(),将 n 的值设置地足够大,每次就可以读取到一行数据。

    例:

    #include <stdio.h>
    #include <stdlib.h>
    #define N 100
    int main(){
        FILE *fp;
        char str[N+1];
        if( (fp=fopen("d:\\demo.txt","rt")) == NULL ){
            puts("Fail to open file!");
            exit(0);
        }
       
        while(fgets(str, N, fp) != NULL){
            printf("%s", str);
        }
        fclose(fp);
        return 0;
    }
    

    fputs() 函数用来向指定的文件写入一个字符串,它的用法为:

    int fputs( char *str, FILE *fp );
    

    str 为要写入的字符串,fp 为文件指针。写入成功返回非负数,失败返回 EOF。
    例如:

    char *str = "http://c.biancheng.net";
    FILE *fp = fopen("D:\\demo.txt", "at+");
    fputs(str, fp);
    

    表示把字符串str写入到D://demo.txt文件中


    fread 和 fwrite

    fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为:

    size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
    

    fwrite() 函数用来向文件中写入块数据,它的原型为:

    size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
    

    对参数的说明:

    • ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。
    • size:表示每个数据块的字节数。
    • count:表示要读写的数据块的块数。
    • fp:表示文件指针。

    理论上,每次读写 size*count 个字节的数据。

    size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。

    返回值:返回成功读写的块数,也即 count。如果返回值小于 count:

    对于 fwrite() 来说,肯定发生了写入错误,可以用 ferror() 函数检测。
    对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror() 或 feof() 检测。

    样例程序:从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。

    #include<stdio.h>
    #define N 2
    struct stu{
        char name[10]; //姓名
        int num;  //学号
        int age;  //年龄
        float score;  //成绩
    }boya[N], boyb[N], *pa, *pb;
    int main(){
        FILE *fp;
        int i;
        pa = boya;
        pb = boyb;
        if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){
            puts("Fail to open file!");
            exit(0);
        }
        //从键盘输入数据
        printf("Input data:\n");
        for(i=0; i<N; i++,pa++){
            scanf("%s %d %d %f",pa->name, &pa->num,&pa->age, &pa->score);
        }
        //将数组 boya 的数据写入文件
        fwrite(boya, sizeof(struct stu), N, fp);
        //将文件指针重置到文件开头
        rewind(fp);
        //从文件读取数据并保存到数据 boyb
        fread(boyb, sizeof(struct stu), N, fp);
        //输出数组 boyb 中的数据
        for(i=0; i<N; i++,pb++){
            printf("%s  %d  %d  %f\n", pb->name, pb->num, pb->age, pb->score);
        }
        fclose(fp);
        return 0;
    }
    

    数据写入完毕后,位置指针在文件的末尾,要想读取数据,必须将文件指针移动到文件开头,这就是 rewind(fp) 的作用。


    fscanf 和 fprintf

    fscanf() 和 fprintf() 函数与前面使用的 scanf() 和 printf() 功能相似,都是格式化读写函数,两者的区别在于 fscanf() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘文件

    这两个函数的原型为:

    int fscanf ( FILE *fp, char * format, ... );
    int fprintf ( FILE *fp, char * format, ... );
    

    fp 为文件指针,format 为格式控制字符串,… 表示参数列表。与 scanf() 和 printf() 相比,它们仅仅多了一个 fp 参数。例如:

    FILE *fp;
    int i, j;
    char *str, ch;
    fscanf(fp, "%d %s", &i, str);
    fprintf(fp,"%d %c", j, ch);
    

    fprintf() 返回成功写入的字符的个数,失败则返回负数。fscanf() 返回参数列表中被成功赋值的参数个数。

    样例程序:用fscanf和fprintf函数来完成对学生信息读写

    #include<stdio.h>
    
    #define N 2
    
    struct stu{
        char name[10];
        int num;
        int age;
        float score;
    } boya[N], boyb[N], *pa, *pb;
    
    int main(){
        FILE *fp;
        int i;
        pa=boya;
        pb=boyb;
        if( (fp=fopen("D:\\demo.txt","wt+")) == NULL ){
            puts("Fail to open file!");
            exit(0);
        }
    
        //从键盘读入数据,保存到boya
        printf("Input data:\n");
        for(i=0; i<N; i++,pa++){
            scanf("%s %d %d %f", pa->name, &pa->num, &pa->age, &pa->score);   
        }
        pa = boya;
        //将boya中的数据写入到文件
        for(i=0; i<N; i++,pa++){
            fprintf(fp,"%s %d %d %f\n", pa->name, pa->num, pa->age, pa->score);   
        }
        //重置文件指针
        rewind(fp);
        //从文件中读取数据,保存到boyb
        for(i=0; i<N; i++,pb++){
            fscanf(fp, "%s %d %d %f\n", pb->name, &pb->num, &pb->age, &pb->score);
        }
        pb=boyb;
        //将boyb中的数据输出到显示器
        for(i=0; i<N; i++,pb++){
            printf("%s  %d  %d  %f\n", pb->name, pb->num, pb->age, pb->score);
        }
    
        fclose(fp);
        return 0;
    }
    

    如果将 fp 设置为 stdin,那么 fscanf() 函数将会从键盘读取数据,与 scanf 的作用相同;设置为 stdout,那么 fprintf() 函数将会向显示器输出内容,与 printf 的作用相同。例如:

    #include<stdio.h>
    int main(){
        int a, b, sum;
        fprintf(stdout, "Input two numbers: ");
        fscanf(stdin, "%d %d", &a, &b);
        sum = a + b;
        fprintf(stdout, "sum=%d\n", sum);
        return 0;
    }
    

    随机读写文件

    在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写。这种读写方式称为随机读写,也就是说从文件的任意位置开始读写。

    实现随机读写的关键是要按要求移动位置指针,这称为文件的定位

    移动文件内部位置指针的函数主要有两个,即 rewind()fseek()

    rewind()用来将位置指针移动到文件开头,原型为:

    void rewind(FILE *fp);
    

    fseek()用来将位置指针移动到任意位置,它的原型为:

    int fseek ( FILE *fp, long offset, int origin );
    

    参数说明:

    1. fp 为文件指针,也就是被移动的文件。

    2. offset 为偏移量,也就是要移动的字节数。之所以为 long 类型,是希望移动的范围更大,能处理的文件更大。offset 为正时,向后移动;offset 为负时,向前移动。

    3. origin 为起始位置,也就是从何处开始计算偏移量。C语言规定的起始位置有三种,分别为文件开头、当前位置和文件末尾,每个位置都用对应的常量来表示:

    在这里插入图片描述

    例如,把位置指针移动到离文件开头100个字节处:

    fseek(fp, 100, 0);
    

    值得说明的是,fseek() 一般用于二进制文件,在文本文件中由于要进行转换,计算的位置有时会出错。

    例:
    在移动位置指针之后,就可以用前面介绍的任何一种读写函数进行读写了。由于是二进制文件,因此常用 fread() 和 fwrite() 读写。

    从键盘输入三组学生信息,保存到文件中,然后读取第二个学生的信息

    #include<stdio.h>
    #define N 3
    struct stu{
        char name[10]; //姓名
        int num;  //学号
        int age;  //年龄
        float score;  //成绩
    }boys[N], boy, *pboys;
    int main(){
        FILE *fp;
        int i;
        pboys = boys;
        if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){
            printf("Cannot open file, press any key to exit!\n");
            getch();
            exit(1);
        }
        printf("Input data:\n");
        for(i=0; i<N; i++,pboys++){
            scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);
        }
        fwrite(boys, sizeof(struct stu), N, fp);  //写入三条学生信息
        fseek(fp, sizeof(struct stu), SEEK_SET);  //移动位置指针
        fread(&boy, sizeof(struct stu), 1, fp);  //读取一条学生信息
        printf("%s  %d  %d %f\n", boy.name, boy.num, boy.age, boy.score);
        fclose(fp);
        return 0;
    }
    

    运行结果:
    Input data:
    Tom 2 15 90.5↙
    Hua 1 14 99↙
    Zhao 10 16 95.5↙
    Hua 1 14 99.000000

    展开全文
  • C语言文件读写

    2018-09-22 20:05:59
    FILE *file =NULL; file=fopen("test.txt","r+"); //rename("test.txt","xinhai.txt"); if(file!=NULL) { printf("The file can be opened.");
    #include<stdio.h>
    
    
    int main()
    
    {
    
    	int age=0;
    	FILE *file =NULL;
    
    
    	file=fopen("test.txt","r+");
    	//rename("test.txt","xinhai.txt");
    	
    	if(file!=NULL)
    	{
    	printf("The file can be opened.");
    	fputc('A',file);
    	fputc('\n',file);
    	fputs("come on",file);
    	
    	
    	printf("您多少岁?\n");
    	scanf("%d",&age);
    	fprintf(file,"使用者年龄是%d岁",age);
    	
    	
    	fclose(file);
    	}
    	
    	
    	else
    	{
    	printf("The file can't be opened.");
    	}
    	remove("test.txt");
    	return 0;
    
    }
    
    展开全文
  • C语言详解 FILE文件操作

    万次阅读 多人点赞 2018-07-20 09:00:53
    进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。 1.2 缓冲区(Buffer): 指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据...

    1. 需要了解的概念

    需要理解的知识点包括:数据流、缓冲区、文件类型、文件存取方式
     

    1.1 数据流:

    指程序与数据的交互是以流的形式进行的。进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。

    1.2 缓冲区(Buffer):

    指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据。它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。

     C语言中带缓冲区的文件处理:

    C语言的文件处理功能依据系统是否设置“缓冲区”分为两种:一种是设置缓冲区,另一种是不设置缓冲区。由于不设置缓冲区的文件处理方式,必须使用较低级的I/O函数(包含在头文件io.h和fcntl.h中)来直接对磁盘存取,这种方式的存取速度慢,并且由于不是C的标准函数,跨平台操作时容易出问题。下面只介绍第一种处理方式,即设置缓冲区的文件处理方式:

    当使用标准I/O函数(包含在头文件stdio.h中)时,系统会自动设置缓冲区,并通过数据流来读写文件。当进行文件读取时,不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据,如下图所示:

    事实上,当写入文件时,并不会马上写入磁盘中,而是先写入缓冲区,只有在缓冲区已满或“关闭文件”时,才会将数据写入磁盘,如下图所示。


    1.3 文件类型:

    分为文本文件和二进制文件两种。

    文本文件是以字符编码的方式进行保存的。二进制文件将内存中数据原封不至文件中,适用于非字符为主的数据。如果以记事本打开,只会看到一堆乱码。

    其实,除了文本文件外,所有的数据都可以算是二进制文件。二进制文件的优点在于存取速度快,占用空间小,以及可随机存取数据。
     

    1.4 文件存取方式:

    包括顺序存取方式和随机存取方式两种。

    顺序读取也就是从上往下,一笔一笔读取文件的内容。保存数据时,将数据附加在文件的末尾。这种存取方式常用于文本文件,而被存取的文件则称为顺序文件。

    随机存取方式多半以二进制文件为主。它会以一个完整的单位来进行数据的读取和写入,通常以结构为单位。


    2. 文本文件操作

    C语言中主要通过标准I/O函数来对文本文件进行处理。相关的操作包括打开、读写、关闭与设置缓冲区。
    相关的存取函数有:fopen(), fclose(), fgetc(), fputc(), fgets(), fputs(), fprintf(), fscanf()等。
     

    2.1 打开文件

    函数原型为:_CRTIMP FILE * __cdecl fopen(const char *, const char *);

    第一参数为文件名,第二个参数为打开模式。

    打开成功,fopen返回一个结构指针地址,否则返回一个NULL。如果没有指定文件路径,则默认为当前工作目录。如:

    FILE *fp;
    fp = fopen("c:\\temp\\test.txt", "r") //由于反斜杠\是控制字符,所以必须再加一个反斜杠

     

    使用fopen()函数打开的文件会先将文件复制到缓冲区。注意:所下达的读取或写入动作,都是针对缓冲区进行存取而不是磁盘,只有当使用fclose()函数关闭文件时,缓冲区中的数据才会写入磁盘。
     

      谈文件打开模式

    打开文本文件:

    "r":只能从文件中读数据,该文件必须先存在,否则打开失败
    "w":只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件
    "a":向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
    "r+":可读/写数据,该文件必须先存在,否则打开失败
    "w+":可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
    "a+":可读/写数据,原来的文件不被删去,位置指针移到文件末尾

    打开二进制文件的模式与打开文本文件的含义是一样的,不同的是模式名称里面多一个字母'b’,以表示以二进制形式打开文件。
     

    2.2 关闭文件

    函数原型为:_CRTIMP int __cdecl fclose(FILE *);

    关闭成功返回值0,否则返回非零值。

    注:在执行完文件的操作后,要进行“关闭文件”操作。虽然程序在结束前会自动关闭所有的打开文件,但文件打开过多会导致系统运行缓慢,这时就要自行手动关闭不再使用的文件,来提高系统整体的执行效率。

     

    例1. 打开文件并进行判断和关闭文件

     

    FILE *fp;
    fp = fopen("c:\\temp\\test.txt", "r");

    if(fp == NULL)
        printf("fail to open the file! \n");
    else
    {
        printf("The file is open! \n");
        fclose(fp);
    }

     

     

    2.3 字符存取函数

    函数原型为:

    _CRTIMP int __cdecl fputc(int, FILE *);
    _CRTIMP int __cdecl fgetc(FILE *);

    字符读取函数fgetc()可从文件数据流中一次读取一个字符,然后读取光标移动到下一个字符,并逐步将文件的内容读出。

    如果字符读取成功,则返回所读取的字符,否则返回EOF(end of file)。EOF是表示数据结尾的常量,真值为-1。另外,要判断文件是否读取完毕,可利用feof()进行检查。未完返回0,已完返回非零值。

    feof()函数原型为:_CRTIMP int __cdecl feof(FILE *);

    例2. fgetc()函数的使用

    版本1:利用feof()函数检查文件是否读取完毕

     

    #include <stdio.h>

    main()
    {
        FILE *fp;
        fp = fopen("c:\\temp\\test.txt", "r");
        if(fp != NULL)
        {
            while(!feof(fp))
                printf("%c", fgetc(fp));
        }
        else
            printf("fail to open! \n");
        fclose(fp);

        return 0;
    }

     


    版本2:利用文件结束标志EOF(即-1)

     

    #include <stdio.h>

    main()
    {
        char ch;
        FILE *fp;
        fp = fopen("c:\\temp\\test.txt", "r");
        if(fp != NULL)
        {
            ch = fgetc(fp);
            while(ch != EOF)
            {
                putchar(ch);
                ch = fgetc(fp);
            }

        }
        else
            printf("fail to open! \n");
        fclose(fp);

        return 0;
    }

     


    版本3 - 重构版本2

     

    #include <stdio.h>

    main()
    {
        char ch;
        FILE *fp;
        if((fp = fopen("test.txt", "r")) != NULL)
            while((ch = fgetc(fp)) != EOF)
                putchar(ch);
        else
            printf("fail to open! \n");
        fclose(fp);

        return 0;
    }

     


    版本4 - 重构版本3 (不正确的重构)

     

    #include <stdio.h>

    main()
    {
        FILE *fp;
        if((fp = fopen("test.txt", "r")) != NULL)
            while(fgetc(fp) != EOF)
                putchar(fgetc(fp));
        else
            printf("fail to open! \n");
        fclose(fp);

        return 0;
    }

     



    若要将字符逐一写入文件,用fputc()函数。示例为:

    例3. fputc()函数的使用

     

    #include <stdio.h>
    #include <conio.h>

    main()
    {
        char filename[20], ch;
        FILE *fp;
        printf("Enter a filename: ");
        scanf("%s", filename);
        printf("Enter some characters to output to file: ");
        if((fp = fopen(filename, "w")) == NULL)
            printf("fail to open! \n");
        else
        {
            while((ch = getche()) != '\015')
                fputc(ch, fp);
        }
        fclose(fp);

        return 0;
    }

     


     

    2.4 字符串存取函数

    函数原型为:

    _CRTIMP int __cdecl fputs(const char *, FILE *);
    _CRTIMP char * __cdecl fgets(char *, int, FILE *);

    fgets函数的作用是从指定文件读入一个字符串,如:fgets(str, n, fp);

    参数n为要求得到的字符个数,但只从fp指向的文件输入n-1个字符,然后在最后加一个'\0'字符,因此得到的字符串共有n个字符,把它们放在字符数组str中。如果在读完n-1个字符之前遇到换行符或EOF,读入结束。

    fputs函数的作用是向指定文件输出一个字符串,如:fputs("Hey", fp);

    把字符串"Hey"输出到fp指向的文件。fputs函数的第一个参数可以是字符串常量、字符数组名或字符型指针。若输出成功,则返回0,否则返回EOF。

    实例略

     

    2.5 格式化存取函数

    函数原型为:

    _CRTIMP int __cdecl fprintf(FILE *, const char *, ...);
    _CRTIMP int __cdecl fscanf(FILE *, const char *, ...);

    它们与printf和scanf函数相仿,都是格式化读写函数。不同的是:fprintf和fscanf函数的读写对象不是终端(标准输入输出),而是磁盘文件。printf函数是将内容输出到终端(屏幕),因此,fprintf就是将内容输出到磁盘文件了。

    实例4. fprintf和fscanf函数的使用

     

    #include <stdio.h>

    void main()
    {
        FILE *fp;

        int num = 10;
        char name[10] = "Leeming";
        char gender = 'M';

        if((fp = fopen("info.txt", "w+")) == NULL)
            printf("can't open the file! \n");
        else
            fprintf(fp, "%d, %s, %c", num, name, gender); //将数据格式化输出到文件info.txt中

        fscanf(fp, "%d, %s, %c", &num, name, &gender); //从文件info.txt中格式化读取数据
        printf("%d, %s, %c \n", num, name, gender); //格式化输出到屏幕

        fclose(fp);
    }

     


     

    2.6 指针重返函数

    函数原型为:

    _CRTIMP void __cdecl rewind(FILE *);;

    rewind函数的作用是使位置指针重返回文件的开头,属于文件的定位。

     

    3. 二进制文件操作

    3.1 数据块存取函数

    函数原型:

    _CRTIMP size_t __cdecl fread(void *, size_t, size_t, FILE *);
    _CRTIMP size_t __cdecl fwrite(const void *, size_t, size_t, FILE *);

    当要求一次存取一组数据(如,一个数组、一个结构体变量的值),fread和fwrite函数可以解决该类问题。它们的调用形式一般为:

    fread(buffer, size, count, fp);
    fwrite(buffer, size, count, fp);

    buffer:对于fread来说,指的是读入数据的存放地址;对于fwrite来说,是要输出数据的地址。
    size:读写数据时,每笔数据的大小
    count:读写数据的笔数
    fp:文件指针
     

    实例5. fread和fwrite函数的使用

     

    #include <stdio.h>
    #define SIZE 3

    typedef enum { MM, GG } Gender;

    typedef struct
    {
        char name[10];
        int  age;
        Gender gender;
    } Person;

    void write2file(Person emp[SIZE])
    {
        FILE *fp;
        if((fp = fopen("emp.txt", "wb")) == NULL)
        {
            printf("cannot open file! \n");
            return;
        }

        for(int i=0; i<SIZE; i++)
            if(fwrite(&emp[i], sizeof(Person), 1, fp) != 1)
                printf("file write error! \n");
        fclose(fp);
    }

    void read_from_file(FILE *fp)
    {
        Person emp_out[SIZE];

        if((fp = fopen("emp.txt", "rb")) == NULL)
        {
            printf("cannot open file! \n");
            return;
        }

        printf("\n%d employee's information read: \n", SIZE);

        for(int i=0; i<SIZE; i++)
        {
            if(fread(&emp_out[i], sizeof(Person), 1, fp) != 1)
                if(feof(fp))
                {
                    fclose(fp);
                    return;
                }
                printf("%-5s %4d %5d \n", emp_out[i].name, emp_out[i].age, emp_out[i].gender);
        }
        fclose(fp);
    }

    void main()
    {
        FILE *fp = NULL;
        Person employee[SIZE];

        printf("Enter %d employee's information: \n", SIZE);
        for(int i=0; i<SIZE; i++)
            scanf("%s %d %d", employee[i].name, &employee[i].age, &employee[i].gender);

        write2file(employee);

        read_from_file(fp);
    }

     


     

    3.2 随机存取函数fseek()

    函数原型:

    _CRTIMP int __cdecl fseek(FILE *, long, int);

    对流式文件可以进行顺序读写,也可以进行随机读写。关键在于控制文件的位置指针,如果位置指针是按字节位置顺序移动的,就是顺序读写。如果能将位置指针按需要移动到任意位置,就可以实现随机读写。所谓随机读写,是指读完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上所需要的字符(字节)。该函数的调用形式为:

    fseek(fp, offset, start);

    start:起始点。用0、1、2代替。0代表文件开始,名字为SEEK_SET,1代表当前位置,名字为SEEK_CUR,2代表文件末尾,名字为SEEK_END。

    fseek()函数一般用于二进制文件,因为文本文件要发生字符转换,计算位置时往往会发生混乱。

    调用实例如:

    fseek(fp, i*sizeof(Person), 0);

     

    https://blog.csdn.net/yong_sun/article/details/8921061

    展开全文
  • 虽然C语言函数库提供了一些对文件操作的函数,但是对于一些新手来说。如何读取文件是一个大的问题,如果只是简单的从文件中读取一个字符,可以使用getc函数读取。可是在读取一段或者整个文件的内容时,很多人都不...
  • C语言简单读取文件数据

    千次阅读 2018-10-22 18:42:56
    在已创建好的文件score1.txt中有两列数据(学号,成绩),现将数据从文件读出放入到两个数组num[]和score[]中,通过输入的学号查找成绩。 /** 知道学号查成绩 *在已创建好的文件score1.txt中有两列数据(学号,成绩...
  • C语言实现登录注册

    万次阅读 多人点赞 2019-01-27 09:36:52
    这是一个用纯C语言文件操作实现的系统的登录、注册和忘记密码功能。可以用于c语言大作业的登录系统。下面分享一下具体的代码。 首先定义一个结构体来存放用户的注册信息,账号密码等。 typedef struct The_users /...
  • 想要实现c语言数据从链表写入到文件和从文件读取到链表这个功能必须 先得了解一些关于文件操作的一些函数 fopen() fclose() fprintf() fscanf() fread() fwrite() 这些都会再我的另外一篇博客中提到 这个代码仅仅是...
  • C语言系列之 链表与相关操作

    万人学习 2015-06-26 11:26:03
    尹成老师带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、...
  • 尹成老师带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、...
  • C语言特点

    千次阅读 多人点赞 2019-07-31 19:10:46
    C语言灵活性较高,里面有很多陷阱,看C语言源码先看头文件,里面包含了大部分数据结构。 C语言具有下面一些特点 由于C语言关键字少(只有32个,输入输出都是库函数,而不是关键字),所以C语言程序便于移植;只要...
  • C语言文件读写函数总结

    千次阅读 多人点赞 2018-04-30 23:51:59
    1、字符写入文件函数 fputc 2、从文件中读取字符 fgetc 二、字符串的读写 1、字符串写入文件函数 fputs 2、从文件中读取字符 fgets 三、块数据读写 1、向文件中写入块数据fwrite 2、从文件中读取块数据fread ...
  • C语言 FILE文件指针

    千次阅读 2015-05-24 22:48:25
    struct_iobuf{ char*_ptr; int _cnt; char*_base; int _flag; int _file; int _charbuf; int _bufsiz; char*_tmpfname; }; typedefs
  • C语言文件的定义,如何对文件进行操作,文件指针,如何定义指向文件的指针,通过文件指针对文件进行操作,文件应用举例,二进制文件相关操作,文件定位
  • C语言文件(FILE)

    千次阅读 多人点赞 2019-04-05 23:19:07
    文章目录一、文件1.1 文件类型指针1.2 文件的打开与关闭1.2.1 文件的打开1.2.2 文件的关闭1.3 文件的读写1.3.1 文本文件的读写1.3.1.1 写字符函数fputc和读字符函数fgetc1.3.1. 2 写字符串函数fputs和读字符串函数...
  • FILE c语言的使用

    千次阅读 2018-06-10 19:55:10
    文件的处理,自己整理的一点点内容,...首先是文件的打开和关闭----定义一个指针,FILE *fp; char ch[20]; fopen("filename.txt","r");前面是文件名,后面是操作类型,r表示只读。 fclose(...
  • C语言系列之 字符串相关算法

    万人学习 2015-06-26 10:56:28
    尹成老师带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、...
  • C语言文件读写操作

    2019-11-19 19:50:09
    分析:从file1.dat文件中逐个字符读入,然后逐个输出到file2.dat中 #include<stdio.h> #include<stdlib.h> int main(){ FILE *in,*out; char ch,infilename[10],outfilename[10]; printf("请输入...
  • 尹成老师,带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯...
  • c语言字符动画的实现

    千次阅读 多人点赞 2018-12-04 21:15:43
    对于此次c语言动画的实现,思路很简单,先从网上下载一段mv及原声音乐,用DVDVideoSoft Free Studio将视频分为3000张图片,再用Ascgen2将3000张图片转化问3000个ASCII字符txt文件,并保持像素的一致,然后通过程序...
  • c语言文件输入输出

    万次阅读 2017-09-30 11:28:41
    重定向的方法写起来简单、自然,但是不能同时读写文件和标准输入输出;fopen的写法稍有繁琐,但是灵活性比较大(例如可以重复打开并读写文件)。如果想把fopen版的程序改成读写标准输入输出,只需要赋值“fin=stdin;...
  • 【C】C语言文件(包括:文件各种读写方式)

    万次阅读 多人点赞 2018-05-09 09:52:32
    文件概述 文件是指存储在外部存储器上的数据集合。更准确的来说,文件就是一组相关元素或数据的有序集合,而且每个集合都有一个符号化的指代,称这个符号化的指代为文件名。 文件类型 根据文件在外部存储器上的...
  • 【C】C语言打开,读取文件

    千次阅读 2018-11-22 02:22:16
    文章目录C语言打开,读取文件一、明明白白我的心二、代码飞起来三、过程不重要,重点看结果 C语言打开,读取文件 一、明明白白我的心 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、...
  • C语言系列之 队列与特殊链表

    千人学习 2015-06-26 11:31:11
    尹成老师带你步入 C 语言的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以 C 语言为核心,完整精彩的演练了数据结构、算法、设计模式、数据库、大数据高并发检索、文件重定向、多线程同步、进程通讯、...

空空如也

1 2 3 4 5 ... 20
收藏数 992,051
精华内容 396,820
关键字:

file