统计文件中字符个数

最后更新于:2022-04-01 14:29:17

所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称 叫做文件名。文件通常是驻留在外部介质上的,在使用的时候才调 入内存中。 就文件的分类,有很多种分类方式,在这里我们看一下文件编码方式。 根据文件的编码方式,文件可以分为ASCII码文件和二进制文件。 ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个 字节,用于存放对应的ASCII码。例如,数字5678的存储形式为: ASCII码: 00110101 00110110 00110111 00111000 十进制码: 5 6 7 8 共占用4个字节。ASCII码文件可在屏幕上按照字符显示。 二进制文件是按照二进制的编码方式来存放文件的。例如,数字5678的 存储形式为00010110 00101110,只占两个字节,二进制文件虽然可以在屏幕上显示,但是其内容无法读懂。C语言处理这些文件的时候,并不区分类型,都看成是字符流,按字节进行处理。 文件指针在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对他所指的文件进行各种操作。定义文件指针的一般形式为”FILE “指针变量标识符。其中FILE应为大写,他实际上是由系统定义的一个结构,该结构中含有文件名,文件状态和文件当前位置等信息。在编写源程序的时候,不必关心FILE结构的细节。例如”FILE fp”表示fp是指向FILE结构的指针变量,通过fp即可找到存放某个文件信息的结构变量,然后按照结构变量提供的信息找到该文件,实施对文件的操作。 在C语言中,文件操作都是由库函数来完成的。文件操作主要有打开,读写和关闭等。 **1:文件打开函数fopen** fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名 = fopen(文件名,使用文件方式) 其中,“文件指针名”必须被说明为FILE类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。 例如: FILE fp; fp = fopen(“file.a”,”r”); //他的意思是在当前目录下打开文件file.a,只允许进行“读”操作,并且使得fp指向该文件 使用文件的方式一共有12种。 ![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-24_5743c0acf2cc8.jpg "") 对于文件使用方式有以下几点说明: 文件使用方式由r,w,a,t,b,+共6个字符组合成,各个字符的含义是:r(read)读,w(write)写, a(append)追加,t(text)文本文件,可省略不写;b(binary)二进制文件;”+”读和写 用r打开一个文件的时候,该文件必须已经存在,且只能从该文件读出 用w打开的文件只能向文件中写入,若打开的文件不存在,则以指定的文件名建立 该文件,如打开的文件已经存在,则将该文件删去,从新建立一个文件 若要向一个已经存在的文件追加新的信息,只能用a方式打开文件。但此时该文件必须是 存在的,否则将会出错。 在打开一个文件的时候,如果出错,fopen将会返回一个空指针值NULL。在程序中可以 用这一信息来判别是否完成打开文件的工作,并做相应的处理。举个例子: if((fp=fopen(“file.a”,”rb”)) == NULL) { printf(“\nerror no open file.a!”); getch(); exit(1); } **2:关闭文件** 调用的一般形式是: fclose(文件指针); 正常完成关闭文件操作的时候,fclose函数返回值为0,如返回非零值则表示有错误发生 **3:文件读写函数** 在C语言中提供了很多文件读写的函数。字符读写函数fgetc和fputc;字符串读写函数fgets和 fputs;数据块读写函数fread和fwrite;格式化读写函数fscanf和fprintf;这些函数 都包含在stdio.h头文件中。 **(1):读字符函数fgetc** fgetc函数的功能是从指定的文件中读取一个字符,函数的调用形式为: 字符变量 = fgetc(文件指针); 注意文件指针和文件内部的位置指针是不同的。文件指针是指向整个文件的, 需要在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的 位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动, 他不需要在程序中定义说明,而是由系统自动设置的。 **(2):写字符函数fputc** fputc函数的功能是把一个字符写入指定的文件中,函数的调用形式为: fputc(字符,文件指针); fputc函数有一个返回值,如果写入成功,则返回写入的字符,否则返回EOF **(3):字符串读写函数fgets和fputs** 读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中, 函数的调用形式为: fgets(字符数组名,n,文件指针); 其中n是一个正整数,表示从文件中读出的字符串不超过n-1个字符,在读入的最后 一个字符加上串结束标识’\0’。对fgets函数有两点说明:在读出n-1个字符之前,如果 遇到了换行符或者是EOF,则结束操作。fgets函数也有返回值,其返回值是字符数组的首 地址。 写字符串函数调用形式: fputs(字符串,文件指针); **(4):块数据读写函数fread和fwrite** 调用形式: fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); buffer是一个指针,在fread中,他表示存放输入数据的首地址。在fwrite中, 他表示存放输出数据的首地址。size表示数据块的字节数,count表示要读写的 数据块的块数。 **(5)格式化读写函数fcanf和fprintf** 调用形式: fcanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 下面就是我们这个实例的要求: ~~~ 编写统计文件的字符数的程序,主要学习文件的概念 和文件操作等内容。 ~~~ 下面是我的代码实现: ~~~ #include <stdio.h> #include <stdlib.h> /** * 编写统计文件的字符数的程序,主要学习文件的概念 * 和文件操作等内容。 */ int main() { /**保存字符个数 **/ int count = 0; /**保存文件名 **/ char fname[80]; /**文件指针 **/ FILE *fp; printf("Please enter the file name:"); scanf("%s",fname); if((fp = fopen(fname,"r")) == NULL){ printf("Open file failed!!\n"); exit(1); } count = 0; while(fgetc(fp) != EOF) count++; fclose(fp); printf("There are %d characters in file %s.\n",count,fname); return 0; } ~~~ 下面是我的测试用例(名称为test.txt): ~~~ cnuidocncn cwncviow wedcvnwicvmnw dcvnwidcvn cvwiovm wvcewoivm w evcovw vcmweiocvmw mvciomvw nvi] v wevmovjov wvjkvnivpvm wvciwmvw 'nvoikvv nvwvmje ewevvvv wvwkvnpowiehf]ewnveiowv ~~~ 好了,最后看一下我的运行过程: ![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-05-24_5743c0ad280c5.jpg "") 除此之外,我们还可以对文件进行随机读写。在C中提供了一些文件定位的函数,我们常用的有两个:rewind和fseek。 这两个函数的调用形式分别为: rewind(文件指针)。 他的功能是把文件内部的位置指针移到文件首。 fseek(文件指针,位移量,起始点); 将文件内部位置指针移动到我们想要的位置。
';