zoukankan      html  css  js  c++  java
  • C语言范例学习06-上

    第六章 文件操作

     

    前言:第五章是C语言在数学上的一些应用,我觉得没有必要,便跳过了。这章正如我标题所写的,是C语言在文件上的操作。学习了这个后,你们可以自行编辑一些所需的快捷程序,来实现一些既定的目的,完成一些重复操作。

    PS:本文中例子皆采用了相对路径,请注意路径问题。

     

    6.1  文件读写操作

      PS:首先确立一个概念,C语言中的“文件”只是一个逻辑概念,可以用来表示从磁盘文件到终端等所有东西,就如同DOS一样的。在这一节中,我们要先学会对磁盘文件进行打开或读写操作的几种不同方法,然后就可以根据不同情况来选择最为恰当的操作方式。

     

    实例167  读取磁盘文件

    问题:编程实现读取某一相对下文本文档内容。(事先放入一个文本内容为“hello world hello master”。)

    逻辑:该实例利用到了一些与文件操作相关的函数。

    •  fopen 文件的打开函数:

        FILE *fp

        fp=fopen(文件名,使用文件方式)

     例如:fp=fopen("123","r");

     它表示要打开名称为123的文本文档,使用文件打开方式为“只读”,fopen函数带回指向123.txt文件的指针并赋给fp,也就是FILE类型指针fp指向123.txt文件。

      PS:使用文件方式:

      “r”  (只读):打开一个文本文件,只允许读数据。

      “w”  (只写):打开或建立一个文本文件,只允许写数据。

      “a”  (追加):打开一个文本文件,并在文件末尾写数据。

      “rb”  (只读):打开一个二进制文件,只允许读数据。

      “wb”  (只写):打开或建立一个二进制文件,只允许写数据。

      “ab”  (追加):打开一个二进制文件,并在文件末尾写数据。

      “r+”  (读写):打开一个文本文件,允许读和写。

      “w+”  (读写):打开或建立一个文本文件,允许读写。

      “a+”  (读写):打开一个文本文件,允许读,或在文件末尾追加数据。

      “rb+”  (读写):打开一个二进制文件,允许读和写。

      “wb+”  (读写):打开或建立一个二进制文件,允许读和写。

      “ab+”  (读写):打开一个二进制文件,允许读,火灾文件末尾追加数据。

    • fclose 文件的关闭函数:

       fclose(文件指针)

       作用是通过文件指针将该文件关闭。

    • fgetc函数:

       ch=fgetc(fp)

       该函数作用是从指定的文件(fp指向的文件)读入一个字符赋给ch。注意该文件必须是以读或读写方式打开。

    其实,说到这里,大家基本就有了问题的思路了。通过fopen函数打开目标文件,将其内存地址赋给fp。再利用循环结构。通过fgetc函数将文件内字符依次赋给ch,显示在屏幕上。最后通过fclose函数关闭文件。

    代码:

     1 #include <stdio.h>
     2 main()
     3 {
     4     FILE *fp;                              /*定义一个指向FILE类型结构体的指针变量*/
     5     char ch, filename[50];                  /*定义变量及数组为字符型*/
     6     printf("please input file`s name;
    ");
     7     gets(filename);                        /*输入文件所在路径及名称*/
     8     fp = fopen(filename, "r");              /*以只读方式打开指定文件*/
     9     ch = fgetc(fp);                        /*fgetc函数带回一个字符赋给ch*/
    10     while (ch != EOF)                       /*当读入的字符值等于EOF时结束循环*/
    11     {
    12         putchar(ch);                       /*将读入的字符输出在屏幕上*/
    13         ch = fgetc(fp);                   /*fgetc函数继续带回一个字符赋给ch*/
    14     }
    15     fclose(fp);                           /*关闭文件*/
    16 }

    注意:EOF表示End Of File,文件读取结束。其值通常为-1,也常在其他函数中表达调用失败的意思。EOF只能用于文本文件。

    反思:其实一开始接触C语言的文件操作会有一些不理解。但是如果有一定汇编或者Win32基础,就会觉得很好理解它的行为了。原本的文件存放于硬盘内存中,利用fopen函数打开它,就是将其展开到内存空间中,并将其内存地址首地址赋给了fopen函数,即fopen函数的返回值。接下来的行为就和正常C语言中指针读取数组内容相似了。最后,通过fclose函数关闭该文件,即将该文件从内存空间中释放。

    实例168  将数据写入磁盘文件

    问题:编程实现向任意路径下新建一个文本文档,想该文档中写入you are the best one!,以“#”结束字符串的输入。

    逻辑:本实例又用到了一个新的函数。

    • fputc函数:

        ch=fputc(ch,fp)

        该函数作用是将一个字符ch写到fp指向的文件内。

        PS:fputc函数的返回值在成功时,为输入的字符,失败时,为EOF。

    代码:

     1 #include <stdio.h>
     2 main()
     3 {
     4     FILE *fp;                                       /*定义一个指向FILE类型结构体的指针变量*/
     5     char ch, filename[50];                            /*定义变量及数组为字符型*/
     6     printf("please input filename:
    ");
     7     scanf("%s", filename);                            /*输入文件所在路径及名称*/
     8     if ((fp = fopen(filename, "w")) == NULL)          /*以只写方式打开指定文件*/
     9     {
    10         printf("cannot open file
    ");
    11         exit(0);
    12     }
    13     ch = getchar();                                  /*fgetc函数带回一个字符赋给ch*/
    14     while (ch != '#')                                 /*当输入"#"时结束循环*/
    15     {
    16         fputc(ch, fp);                                /*将读入的字符写到磁盘文件上去*/
    17         ch = getchar();                              /*fgetc函数继续带回一个字符赋给ch*/
    18     }
    19     fclose(fp);                                      /*关闭文件*/
    20 }

    注意:代码行.8中条件判断条件“(fp = fopen(filename, "w")) == NULL)”的使用,细细理解。

    反思:同样利用汇编基础可以很好理解,不再赘述。

    实例169:  格式化读写文件

    问题:编程实现将输入的小写字母串写入磁盘文件,再将刚写入磁盘文件的内容读出并以大写字母的形式显示在屏幕上。

    逻辑:同样,这次实例又有一些新的函数。

    • fprintf函数:

        ch=fprintf(文件指针,格式字符串,输出列表)

     例如:fprintf(fp,"%d",i);

     它表示将整型变量i的值按%d的格式输出到fp指向的文件上。

    • fscanf函数:

        fscanf(文件指针,格式字符串,输入列表)

     例如:fscanf(fp,"%d",&i);

     它表示以%d的格式读入fp所指向的文件上i的值。

    代码:

     1 #include <stdio.h>
     2 main()
     3 {
     4     int i, flag = 1;                                  /*定义变量为基本整型*/
     5     char str[80], filename[50];                        /*定义数组为字符型*/
     6     FILE *fp;                                        /*定义一个指向FILE类型结构体的指针变量*/
     7     printf("please input filename:
    ");
     8     scanf("%s", filename);                             /*输入文件所在路径及名称*/
     9     if ((fp = fopen(filename, "w")) == NULL)            /*以只写方式打开指定文件*/
    10     {
    11         printf("cannot open!");
    12         exit(0);
    13     }
    14     while (flag == 1)
    15     {
    16         printf("
    Input string:
    ");
    17         scanf("%s", str);                                /*输入字符串*/
    18         fprintf(fp, "%s", str);                           /*将str字符串内容以%s形式写到fp所指文件上*/
    19         printf("
    Continue:?(Y/N)");
    20         if ((getchar() == 'N') || (getchar() == 'n'))     /*输入n结束输入*/
    21             flag = 0;                                     /*标志位置0*/
    22     }
    23     fclose(fp);                                          /*关闭文件*/
    24     fp = fopen(filename, "r");                            /*以只写读方式打开指定文件*/
    25     while (fscanf(fp, "%s", str) != EOF)                   /*从fp所指的文件中以%s形式读入字符串*/
    26     {
    27         for (i = 0; str[i] != ''; i++)
    28             if ((str[i] >= 'a') && (str[i] <= 'z'))
    29                 str[i] -= 32;                             /*将小写字母转换为小写字母*/
    30         printf("
    %s
    ", str);                            /*输出转换后的字符串*/
    31     }
    32     fclose(fp);                                          /*关闭文件*/
    33 }

    注意:代码行.12中“exit(0)”一点运行,就直接退出程序。其表示正常退出。另外,exit(1)表示异常退出,即程序出现不该出现的异常。windows中可以通过GetExitCodeProcess函数来获取退出代码。

    反思:这个实例只能说是前两个实例的小小综合,再加上str的应用。大小写字母转换这种老问题,就不提了。

     

    实例170  成块读写操作

    问题:编程实现学生成绩信息统计,从键盘中输入学生成绩信息,保存到指定磁盘文件中,输入完全部信息后将磁盘文件中保存的信息输出到屏幕上。

    逻辑:老惯例,再来几个新函数。

    • fwrite函数:

       fwrite(buffer ,size,count,fp)

       它的作用是将buffer地址开始的信息,输入count次,每次写size字节到fp所指定的文件中。

    • fread函数:

       fread(buffer,size,count,fp)

       它的作用是从fp所指向的文件中读入count次,每次读size字节,读入的信息存在buffer地址中。

    注意这两个函数形参即其代表的意思,毕竟参数还是蛮多的。

    代码:

     1 #include <stdio.h>
     2 struct student_score                                     /*定义结构体存储学生成绩信息*/
     3 {
     4     char name[10];
     5     int num;
     6     int China;
     7     int Math;
     8     int English;
     9 } score[100];
    10 void save(char *name, int n)                             /*自定义函数save,用于将数据存储起来*/
    11 {
    12     FILE *fp;                                          /*定义一个指向FILE类型结构体的指针变量*/
    13     int i;
    14     if ((fp = fopen(name, "wb")) == NULL)               /*以只写方式打开指定文件*/
    15     {
    16         printf("cannot open file
    ");
    17         exit(0);
    18     }
    19     for (i = 0; i < n; i++)
    20         if (fwrite(&score[i], sizeof(struct student_score), 1, fp) != 1)  /*将一组数据输出到fp所指的文件中*/
    21             printf("file write error
    ");                /*如果写入文件不成功,则输出错误*/
    22     fclose(fp);                                          /*关闭文件*/
    23 }
    24 void show(char *name, int n)                            /*自定义函数show,用于将数据展现到显示屏上*/
    25 {
    26     int i;
    27     FILE *fp;                                           /*定义一个指向FILE类型结构体的指针变量*/
    28     if ((fp = fopen(name, "rb")) == NULL)                 /*以只读方式打开指定文件*/
    29     {
    30         printf("cannot open file
    ");
    31         exit(0);
    32     } for (i = 0; i < n; i++)
    33     {
    34         fread(&score[i], sizeof(struct student_score), 1, fp);    /*从fp所指向的文件读入数据存到数组score中*/
    35         printf("%-10s%4d%4d%4d%4d
    ", score[i].name, score[i].num,
    36             score[i].China, score[i].Math, score[i].English);
    37     }
    38     fclose(fp);                                         /*以只写方式打开指定文件*/
    39 }
    40 main()
    41 {
    42     int i, n;                                            /*变量类型为基本整型*/
    43     char filename[50];                                    /*数组为字符型*/
    44     printf("how many students in your class?
    ");
    45     scanf("%d", &n);                                      /*输入学生数*/
    46     printf("please input filename:
    ");
    47     scanf("%s", filename);                                /*输入文件所在路径及名称*/
    48     printf("please input name,number,China,math,English:
    ");
    49     for (i = 0; i < n; i++)                               /*输入学生成绩信息*/
    50     {
    51         printf("NO%d", i + 1);
    52         scanf("%s%d%d%d%d", score[i].name, &score[i].num, &score[i].China,
    53             &score[i].Math, &score[i].English);
    54         save(filename, n);                                /*调用函数save*/
    55     } show(filename, n);                                  /*调用函数show*/
    56 }

    注意:代码行.35中“%-10s%4d%4d%4d%4d ”,希望还记得printf函数输出格式的设置。代码行.35-36,如果看不懂,请将代码分解开来,这句代码只是一个小小的综合应用。

    实例171  随机读写文件

    问题:输入若干个学生信息,保存到指定磁盘文件中,要求将奇数条学生信息从磁盘中读入并显示在屏幕上。

    逻辑:再介绍一个函数。

    • fseek函数:

        fseek(文件类型指针,位移量,起始点)

        它的作用是用来移动文件内部位置指针,其中参数“起始点”表示从何处开始计算位移量。规定的起始点有3种:文件首、文件当前位置和文件尾。

      PS:起始点表示法:

      “起始点”    “表示符号”      “数字表示”

      “文件开头”   “SEEK-SET”     “0”

      “当前位置”   “SEEK-CUR”     “1”

      “文件末尾”   “SEEK-END”     “2”

     例如:fseek(fp,-20L,1);

     它表示将位置指针从当前位置,向后退20字节。(注意后退的意思。)

    代码:

     1 #include <stdio.h>
     2 struct student_type                                  /*定义结构体存储学生信息*/
     3 {
     4     char name[10];
     5     int num;
     6     int age;
     7 }stud[10];
     8 void save(char *name, int n)                           /*自定义函数save*/
     9 {
    10     FILE *fp;
    11     int i;
    12     if ((fp = fopen(name, "wb")) == NULL)               /*以只写方式打开指定文件*/
    13     {
    14         printf("cannot open file
    ");
    15         exit(0);
    16     }
    17     for (i = 0; i < n; i++)
    18         if (fwrite(&stud[i], sizeof(struct student_type), 1, fp) != 1)  /*将一组数据输出到fp所指的文件中*/
    19             printf("file write error
    ");               /*如果写入文件不成功,则输出错误*/
    20     fclose(fp);                                         /*关闭文件*/
    21 }
    22 main()
    23 {
    24     int i, n;                                           /*变量类型为基本整型*/
    25     FILE *fp;                                           /*定义一个指向FILE类型结构体的指针变量*/
    26     char filename[50];                                   /*数组为字符型*/
    27     printf("please input filename:
    ");
    28     scanf("%s", filename);                               /*输入文件所在路径及名称*/
    29     printf("please input the number of students:
    ");
    30     scanf("%d", &n);                                     /*输入学生数*/
    31     printf("please input name,number,age:
    ");
    32     for (i = 0; i < n; i++)                              /*输入学生信息*/
    33     {
    34         printf("NO.%d", i + 1);
    35         scanf("%s%d%d", stud[i].name, &stud[i].num, &stud[i].age);
    36         save(filename, n);                               /*调用函数save*/
    37     } if ((fp = fopen(filename, "rb")) == NULL)         /*以只读方式打开指定文件*/
    38     {
    39         printf("can not open file
    ");
    40         exit(0);
    41     }
    42     for (i = 0; i < n; i += 2)
    43     {
    44         fseek(fp, i *sizeof(struct student_type), 0);    /*随着i的变化从文件开始处随机读文件*/
    45     fread(&stud[i], sizeof(struct student_type), 1, fp);   /*从fp所指向的文件读入数据存到数组stud中*/
    46         printf("%-10s%5d%5d
    ", stud[i].name, stud[i].num, stud[i].age);
    47     }
    48     fclose(fp);                                          /*关闭文件*/
    49 }
    50 

    反思:这里利用了一个调用函数,一个结构体。如果没有忘记这些概念,便不存在理解问题了。

    实例172  以行为单位读写文件

    问题:从键盘中输入字符串“hello world hello boy”,利用fputs函数见字符串内容输出到磁盘文件中,使用fgets函数从磁盘文件中读取字符串到数组s中,最终将其输出到屏幕上。

    逻辑:这里又增添两个函数。

    • fputs函数:

        fputs(字符串,文件指针)

        它的作用是想指定的文件写入一个字符串,其中字符串可以是字符串常量,也可以是字符串数组名、指针或者变量。

    • fgets函数:

        fgets(字符数组名,n,文件指针)

        它的作用从指定的文件中读入一个字符串到字符数组中。n表示所得到的字符串中字符的个数(包含字符串结束符“”(表示NULL))。

    代码:

     1 #include <stdio.h>
     2 main()
     3 {
     4     FILE *fp;                   /*定义一个指向FILE类型结构体的指针变量*/
     5     char str[100], s[100], filename[50];   /*定义数组为字符型*/
     6     printf("please input string!
    ");
     7     gets(str);                  /*获得字符串*/
     8     printf("please input filename:
    ");
     9     scanf("%s", filename);           /*输入文件所在路径及名称*/
    10     if ((fp = fopen(filename, "wb")) != NULL)
    11                             /*以只写方式打开指定文件*/
    12     {
    13         fputs(str, fp);             /*把字符数组str中的字符串输出到fp指向的文件*/
    14         fclose(fp);
    15     }
    16     else
    17     {
    18         printf("cannot open!");
    19         exit(0);
    20     }
    21     if ((fp = fopen(filename, "rb")) != NULL)
    22     {
    23         while (fgets(s, sizeof(s), fp))
    24                              /*从fp所指的文件中读入字符串存入s中*/
    25             printf("%s", s);
    26                              /*将字符串输出*/
    27 
    28         fclose(fp);               /*关闭文件*/
    29     }

    反思:区分fgetc、fgets、fputc、fputs的区别。看待这些问题时应当不断更换着自己观察的角度。比如fprintf是将内容显示到屏幕上,其实fprintf只是C语言内的一个来自stdio库函数的封装函数,来实现C的文件对屏幕的输入(代码自行查找)。而那些库函数中的函数也都是通过调用Windows中API函数来实现其功能的。再往底层探去,Windows的API函数也是C语言。其下方的抽象层却由汇编构成。是不是很神奇。

     

    6.2  文件内容操作

    实例173  复制文内容到另一个文件

    问题:编程实现将一个已存在的文本文档的内容复制到新建的文本文档中。

    逻辑:其实前面我们已经实现了从文件到屏幕,从屏幕到文件的操作,那么将两者综合一下,就是这次实例的结果。要注意,读取时,两个文件都应该处在打开的状态。应该在结束时一起关闭。

    代码:

     1 #include <stdio.h>
     2 main()
     3 {
     4     FILE *in,*out;                                      /*定义两个指向FILE类型结构体的指针变量*/
     5     char ch, infile[50], outfile[50];                     /*定义数组及变量为基本整型*/
     6     printf("Enter the infile name:
    ");
     7     scanf("%s", infile);                                 /*输入将要被复制的文件所在路径及名称*/
     8     printf("Enter the outfile name:
    ");
     9     scanf("%s", outfile);                                /*输入新建的将用于复制的文件所在路径及名称*/
    10     if ((in = fopen(infile, "r")) == NULL)               /*以只写方式打开指定文件*/
    11     {
    12         printf("cannot open infile
    ");
    13         exit(0);
    14     }
    15     if ((out = fopen(outfile, "w")) == NULL)
    16     {
    17         printf("cannot open outfile
    ");
    18         exit(0);
    19     }
    20     ch = fgetc(in);
    21     while (ch != EOF)
    22     {
    23         fputc(ch, out);                                 /*将in指向的文件的内容复制到out所指向的文件中*/
    24         ch = fgetc(in);
    25     }
    26     fclose(in);
    27     fclose(out);
    28 }

    实例174  错误处理

    问题:编程实现将文件中的制表符换成恰当数量的空格,要求每次读写操作后都调用ferror()函数检查错误。

    逻辑:文件在错误处理中的专有函数.

    • ferror函数:

      例子:int ferror(FILE*stream);

      这表示检测文件错误。返回值为0,表示没有出现错误,而非零值表示是有错的。

    代码:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 void error(int e)/*自定义error函数判断出错的性质*/
     4 {
     5     if(e == 0)
     6         printf("input error
    ");
     7     else
     8         printf("output error
    ");
     9     exit(1);    /* 跳出程序 */
    10 }
    11 main()
    12 {
    13     FILE *in,  *out; /*第一两个文件类型指针in和out*/
    14     int tab, i;
    15     char ch, filename1[30], filename2[30];
    16     printf("please input the filename1:");
    17     scanf("%s", filename1); /*输入文件路径及名称*/
    18     printf("please input the filename2:");
    19     scanf("%s", filename2); /*输入文件路径及名称*/
    20     if ((in = fopen(filename1, "rb")) == NULL)
    21     {
    22         printf("can not open the file %s。
    ", filename1);
    23         exit(1);
    24     }
    25     if ((out = fopen(filename2, "wb")) == NULL)
    26     {
    27         printf("can not open the file %s。
    ", filename2);
    28         exit(1);
    29     }
    30     tab = 0;
    31     ch = fgetc(in); /*从指定的文件中读取字符*/
    32     while (!feof(in))
    33      /*检测是否有读入错误*/
    34     {
    35         if (ferror(in))
    36             error(0);
    37         if (ch == '	')
    38          /*如果发现制表符,则输出相同数目的空格符*/
    39         {
    40             for (i = tab; i < 8; i++)
    41             {
    42                 putc(' ', out);
    43                 if (ferror(out))
    44                     error(1);
    45             }
    46             tab = 0;
    47         }
    48         else
    49         {
    50             putc(ch, out);
    51             if (ferror(out))
    52              /*检查是否有输出错误*/
    53                 error(1);
    54             tab++;
    55             if (tab == 8)
    56                 tab = 0;
    57             if (ch == '
    ' || ch == '
    ')
    58                 tab = 0;
    59         }
    60         ch = fgetc(in);
    61     }
    62 
    63     fclose(in);
    64     fclose(out);
    65 }

    反思:头文件中的stdlib.h与stdio.h的区别,具体可以去百度。我的感觉就是初级编程stdio.h够用了,而涉及到系统,比如system.或者exit()等,就需要stdlib.h。但是有的时候就算你不用,编译器也只是会提出警告,但并不影响代码编译,运行。比如这个程序的代码行.9中的“exit(1)”就需要stdlib.h,但是不加,也只是警告,不会报错,导致无法编译、运行。

    实例175  合并两个文件信息

    问题:有两个内容分别为“hello computer!!”与“This is a c program!!”的文本文档,编程实现合并两个文件的信息。

    逻辑:这个问题,你可以将一个文本的内容添加到另一个文本中,也可以将这两个文本添加到一个新建的文本中。这里,我们为了减少操作,采用了前者。

    代码:

     1 #include <stdio.h>
     2 main()
     3 {
     4     char ch, filename1[50], filename2[50];                        /*数组和变量的数据类型为字符型*/
     5     FILE *fp1,  *fp2;                                        /*定义两个指向FILE类型结构体的指针变量*/
     6     printf("please input filename1:
    ");
     7     scanf("%s", filename1);                                    /*输入文件所在路径及名称*/
     8     if ((fp1 = fopen(filename1, "a+")) == NULL)                    /*以读写方式打开指定文件*/
     9     {
    10         printf(" cannot open
    ");
    11         exit(0);
    12     }
    13     printf("file1:
    ");
    14     ch = fgetc(fp1);
    15     while (ch != EOF)
    16     {
    17         putchar(ch);                                        /*将文件1中的内容输出*/
    18         ch = fgetc(fp1);
    19     }
    20     printf("
    please input filename2:
    ");
    21     scanf("%s", filename2);                                    /*输入文件所在路径及名称*/
    22     if ((fp2 = fopen(filename2, "r")) == NULL)                    /*以只读方式打开指定文件*/
    23     {
    24         printf("cannot open
    ");
    25         exit(0);
    26     }
    27     printf("file2:
    ");
    28     ch = fgetc(fp2);
    29     while (ch != EOF)
    30     {
    31         putchar(ch);                                        /*将文件2中的内容输出*/
    32         ch = fgetc(fp2);
    33     }
    34     fseek(fp2, 0L, 0);                                        /*将文件2中的位置指针移到文件开始处*/
    35     ch = fgetc(fp2);
    36     while (!feof(fp2))
    37     {
    38         fputc(ch, fp1);                                    /*将文件2中的内容输出到文件1中*/
    39         ch = fgetc(fp2);                                    /*继续读取文件2中的内容*/
    40     }
    41     fclose(fp1);                                            /*关闭文件1*/
    42     fclose(fp2);                                            /*关闭文件2*/
    43 }

    反思:代码行.34中的“fseek(fp2,0L,0)”是个不可缺少的代码。回想一下这篇文章开头,我们提到的文件操作本质。当我们第二个循环执行后,其fp2指向的并不是我们需要的文档开头,这中间我们也没有执行某个代码,使得fp2指向文档开头。所以,我们需要通过fseek函数,来转移指针fp2指向。

    实例176  统计文件内容

    问题:编程实现对指定文件中的内容进行统计。具体要求:输入要进行统计的文件的路径及名称,统计出该文件中字符、空格、数字及其他字符的个数,并将统计结果存到指定的磁盘文件中。

    逻辑:统计问题是个常见问题,这次只是将其与文件操作结合起来而已。

    代码:

     1 #include <stdio.h>
     2 main()
     3 {
     4     FILE *fp1,  *fp2;                                    /*定义两个指向FILE类型结构体的指针变量*/
     5     char filename1[50], filename2[50], ch;                    /*定义数组及变量为字符型*/
     6     long character, space, other, digit;                        /*定义变量为长整形*/
     7     character = space = digit = other = 0;                    /*长整形变量的初值均为0*/
     8     printf("Enter file name 
    ");
     9     scanf("%s", filename1);                                /*输入要进行统计的文件的路径及名称*/
    10     if ((fp1 = fopen(filename1, "r")) == NULL)
    11      /*以只读方式打开指定文件*/
    12     {
    13         printf("cannot open file
    ");
    14         exit(1);
    15     }
    16     printf("Enter file name for write data:
    ");
    17     scanf("%s", filename2);                                /*输入文件名即将统计结果放到那个文件中*/
    18     if ((fp2 = fopen(filename2, "w")) == NULL)                /*以可写方式要存放统计结果的文件*/
    19     {
    20         printf("cannot open file
    ");
    21         exit(1);
    22     }
    23     while ((ch = fgetc(fp1)) != EOF)                        /*知道文件内容结束处停止while循环*/
    24         if (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z')
    25             character++;                                /*当遇到字母时字符个数加1*/
    26     else if (ch == ' ')
    27         space++;                                    /*当遇到空格时空格数加1*/
    28     else if (ch >= '0' && ch <= '9')
    29         digit++;                                    /*当遇到数字时数字数加1*/
    30     else
    31         other++;                                    /*当是其他字符时其他字符数加1*/
    32     close(fp1);                                        /*关闭fp1指向的文件*/
    33     fprintf(fp2, "character:%ld space:%ld digit:%ld other:%ld
    ", character,
    34         space, digit, other);                                /*将统计结果写入fp指向的磁盘文件中*/
    35     fclose(fp2);                                        /*关闭fp2指向的文件*/
    36 }

    反思:开头建立的两个FILE指针,一个指向需要打开的文件,一个指向用来记录结果的文件。代码行.24与.28是有好东西的,两者类似,那么只谈.28吧。代码行.28中的“ch>='0'&&ch<='9'”,其实这里面存在一个隐式转换,将字符转换为ASCII值来进行比较。

    总结&反思:至此,C语言有关文件操作部分的基础内容就完毕了。后面还会有一篇,简单提升的文章。说起来,学习文件操作一方面是学习新函数,另一方面是学习其基础流程。至于如何扩展,就看个人了。

  • 相关阅读:
    Java18(泛型,反射,内省)
    Java17(线程池、Runnable和Callable、Lock、信号量、任务调度、Timer)
    Javaday16(守护线程,线程同步,线程通讯)
    面试题错题集04(异常)
    面试题错题集03(数组)
    面试题错题集02(面向对象)
    Javaday15(Queue,Collections工具类,多线程)
    Java中的内部接口
    ISO14229:2013 之 通过标志读数据ReadDataByIdentifier (0x22)
    Oracle数据库迁移至PostgreSQL数据库问题及解决
  • 原文地址:https://www.cnblogs.com/Tiancheng-Duan/p/5928678.html
Copyright © 2011-2022 走看看