统计文件中字符个数

所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称
叫做文件名。文件通常是驻留在外部介质上的,在使用的时候才调
入内存中。

就文件的分类,有很多种分类方式,在这里我们看一下文件编码方式。
根据文件的编码方式,文件可以分为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种。

这里写图片描述

对于文件使用方式有以下几点说明:

文件使用方式由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

好了,最后看一下我的运行过程:

这里写图片描述

除此之外,我们还可以对文件进行随机读写。在C中提供了一些文件定位的函数,我们常用的有两个:rewind和fseek。

这两个函数的调用形式分别为:

rewind(文件指针)。

他的功能是把文件内部的位置指针移到文件首。

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

将文件内部位置指针移动到我们想要的位置。

posted @ 2015-09-02 09:49  陈洪波  阅读(776)  评论(0编辑  收藏  举报