统计文件中字符个数
最后更新于: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(文件指针,位移量,起始点);
将文件内部位置指针移动到我们想要的位置。