欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言程序设计学习笔记--对文件的输入输出

程序员文章站 2022-04-15 12:52:03
C语言程序设计学习笔记--对文件的输入输出。 10.1 C文件有关基本知识 1.定义: 文件——指存储在外部介质上的数据集合(数据文件),操作系统以文...

C语言程序设计学习笔记--对文件的输入输出。

10.1 C文件有关基本知识

1.定义:

文件——指存储在外部介质上的数据集合(数据文件),操作系统以文件为单位对数据进行管理

2.分类:

从用户的观点看:

? 特殊文件——指标准输入输出文件或标准设备文件。

? 普通文件——指磁盘文件。

2、从操作系统的角度看:每一个与主机相关联的输入输出设备都可看作一个文件。

(1)根据文件的组织形式分为:顺序存取文件 和 随机存取文件。

(2)根据文件的存储形式分为:ASCII文件 和 二进制文件。

3.文件缓冲区

C语言中对文件的存取是以字符(字节)为单位的,一个输入输出流就是一个字节流或二进制流。

文件的存储方式分为缓冲文件系统和非缓冲文件系统。区别是缓冲文件系统是系统自动开辟缓冲区,非缓冲文件系统是由程序为每个文件设定缓冲区。

ANSI C标准只采用缓冲文件系统 来处理文件。

 

4.文件类型结构体类型

缓冲文件系统中,每个被使用的文件都在内存中开辟一个FILE结构体类型的区,用来存放文件的有关信息(文件名字、文件状态、当前位置、缓冲区等有关信息),

FILE结构体类型原型:

? typedef struct{
short level; /*缓冲区“满”或“空”的程度*/
unsigned flags; /*文件状态标志*/
char fd; /*文件描述符*/
unsigned char hold; /*如无缓冲区不读取字符*/
short bsize; /*缓冲区的大小*/
unsigned char *buffer; / *数据缓冲区的位置*/
unsigned char *curp; /*指针,当前的指向*/
unsigned istemp; /*临时文件,指示器*/
short token;/*用于有效性检查*/}FILE;

5.文件结构体数组和指针

? FILE *fp——声明了一个指向FILE类型结构体的指针变量。

? FILE f[5]——声明了一个文件结构体数组f,它有5个元素,存放5个文件的信息。

? FILE 变量——声明了一个文件结构体变量。

10.2打开与关闭文件

C语言要求,在文件读写之前要“打开”文件,在使用结束后要“关闭”文件。

1、打开文件:

? FILE *fp;

? fp=fopen(“文件名”,“使用文件方式”);指针变量指向被打开的文件。

例如:fp = fopen(“a1”,“r”)。

2、关闭文件:

fclose(文件指针);返回值:关闭成功返回值为0;否则返回EOF(-1) 。

使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作。

10.3顺序读写数据文件

1.向文件读写字符

(1)将字符写到文件中:

fputc ( ch,fp) ;返回值:如果输出成功,则返回值就是输出的字符;如果输出失败,则返回一个EOF(-1)。

将字符(ch的值)输出到文件指针fp所指向的文件中去。该文件必须是以写或读写方式打开的。

(2)将字符从文件中读出:

ch=fgetc(fp);返回值:读取成功一个字符,赋给ch。如果遇到文件结束符,返回一个文件结束标志EOF(-1)。

从指定的文件读入一个字符,该文件必须是以读或读写方式打开的。

 

注意:ANSI C提供一个feof()函数来判断文件是否真的结束。如果是文件结束,函数feof(fp)的值为1(真);否则为0(假)。以上也适用于文本文件的读取。

 

 

2.向文件读写一个字符串

? fgets(str,n,fp); 从fp指向的文件读出n-1个字符,在最后加一个’\0’。返回值:str的首地址。如果遇到EOF则读入结束。

? fputs(“china”,fp); 把字符串写入到fp指向的文件。第一个参数可以是字符串常量、字符数组名或字符型指针。字符串末尾的′\0′不输出。

 

3.格式化方式读写文件

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

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

注意:

用fprintf和fscanf函数对磁盘文件读写,使用方便,容易理解,但由于在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。

4.数据块读写:

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

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

buffer:是一个指针。对fread 来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址(均指起始地址)。

size: 要读写的字节数。

count: 要进行读写多少个size字节的数据项。

fp: 文件型指针。

5.以“字”或者整数为单位读写函数:

? putw(int i,FILE * fp);

? int i = getw(FILE * fp);

10.4随机读写数据文件

随机访问可以对任何位置的数据进行访问吗

1.文件位置标记以及其定位

文件位置标记:用来指示“接下来读写的下一个字符的位置”。

2.文件位置标记的定位:可以强制使文件位置标记指向人们指定的位置。

1、将文件当前的位置指针重新返回到文件的开头位置:无返回值。

3.A.rewind (fp);执行后,将文件的位置指针重新定位到文件的开头。

随机读写:改变文件的位置指针,一般用于二进制文件。

fseek(文件类型指针,位移量,起始点);无返回值。

起始点:文件开头 SEEK_SET 0

文件当前位置 SEEK_CUR 1

文件末尾 SEEK_END 2

C.位移量:以起始点为基点,向后(前,末尾时)移动的字节数。一般要求为long型。

D.获取流式文件当前的位置指针:返回当前位置——用相对于文件开头的位移量来表示。,出错时返回EOF。

i =ftell(fp);

10.6文件读写的出错检测

1、ferror(fp);返回0,表示未出错;返回非0,表示出错。

注意:在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。

2、clearerr(fp);使文件错误标志和文件结束标志置为0。

只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。调用后feeror(fp)的值变为0,且文件结束标志置为0。

 

10.6小总结

分类 函数名 功能

打开文件 fopen() 打开文件

关闭文件 fclose() 关闭文件

文件定位 fseek() 改变文件位置指针的位置

Rewind() 使文件位置指针重新至于文件开头

Ftell() 返回文件位置指针的当前值

文件状态 feof() 若到文件末尾,函数值为真

Ferror() 若对文件操作出错,函数值为真

Clearerr() 使ferror和feof()函数值置零

文件读写 fgetc(),getc()从指定文件取得一个字符

fputc(),putc()把字符输出到指定文件

fgets()从指定文件读取字符串

fputs()把字符串输出到指定文件

getw()从指定文件读取一个字(int型)

putw()把一个字输出到指定文件

fread()从指定文件中读取数据项

fwrite()把数据项写到指定文件中

fscanf()从指定文件按格式输入数据

fprintf()按指定格式将数据写到指定文件中