一、FILE结构体:

#include<stdio.h>

#ifndef_FILE_DEFINEDstruct_iobuf{char*_ptr;//文件输入的下一个位置int_cnt;//当前缓冲区的相对位置char*_base;//指基础位置(文件的起始位置)int_flag;//文件标志int_file;//文件的有效性验证int_charbuf;//检查缓冲区状况,如果无缓冲区则不读取int_bufsiz;//文件的大小char*_tmpfname;//临时文件名};typedefstruct_iobufFILE;#define_FILE_DEFINED#endif

文件指针:通常用一个指针变量指向一个文件,这个指针变量即称为文件指针。

定义的一般形式: FILE *指针变量标识符;

例:FILE *fp; // fp:指向文件的文件指针

二、文件的 打开

1.读写文件之前需要进行文件打开(fopen()的调用)

FILE *fp=fopen((被打开的)文件名,使用文件方式(文件类型和操作要求));

例:

FILE *fp1,*fp2;

fp1=fopen("file","r");

fp2=fopen("c:\\file","rb");

2.文件使用方式

1)以字符为标志:

r(read) 只读---打开文件(必须存在),只能进行读取。

w(write) 只写---创建文件,以进行写入。如果文件已经存在,则删除当前内容。

a(append) 追加---追加,打开或创建文件以在文件尾部写入。

r+ 打开文件以进行更新(读取和写入)。

w+ 创建文件以进行更新。如果文件已经存在,则删除当前内容。

a+ 追加,打开或者创建文件以进行更新,在文件尾部写入。


t(text) 文本文件,可省略不写(默认)

b(banary) 二进制文件

+ 读和写


2)使用情况:

打开文件时,若出错,fopen()返回NULL。

if(fp==fopen("c:\\file","r")){printf("\nerroronopenc:\\file!");exit(1);}

将文本文件读入内存,需将ASCII码转换为二进制;反之,将文件以文本方式存入外存储器,将二进制转换为ASCII码。(文本文件读写花费时间较长,二二进制文件读写不存在这种转换)

系统可直接打开及直接使用:标准输入文件、标准输出文件、标准出错输出,定义指针stdin、stdout、stderr分别指向它们(它们的_file描述符分别是0、1和2),因而终端输入输出不许打开终端文件。

三、文件的 关闭

文件使用完毕需进行关闭(fclose()的调用)

fclose(文件指针); 例: fclose(fp);

四、文件的 读写

1、字符读写函数 -------【读写一个字符】

fgetc() --- 字符变量=fgetc(文件指针); 其文件必须含有 “读” 权限;可连续多次使用,都区多个字符。

例: ch=fgetc(fp);

fputc() --- fputc(字符表达式,文件指针); 其文件必须含有 “写、追加 权限; 输入成功则返回写入字符,否则返回EOF。

例:fputc('a',fp);

2.字符串读写函数 ------- 【读写字符串】

fgets(字符数组,n,文件指针); //从文件中读取长度为 n-1 的字符串并存入到字符数组中,读入完后,最后自动加上“\0”. --------读字符串函数

若过程中遇到“换行”或“EOF”,则提前结束;成功则返回值为字符数组的首地址;否则,返回NULL。

例: fgets(str,n,fp);

fputs(字符串,文件指针); //向指定的文件中写入一个给定的字符串;

字符串末尾的“\0”不写入文件; 成功返回值为0,否则,返回值非零。

3.数据块读写函数 ------- 【读写数据块】

fread(buffer,size,count,fp);

fwrite(buffer,size,count,fp);

注释:buffer:指针,表示存放读入数据的首地址(fread());表示存放要写入文件的数据的首地址(fwrite());

size:数据块的字节数

count:要读写的数据块块数

每执行一次操作,文件内部的位置指针自动向后移一位。

成功则返回count的值(读写数据块的数目),否则返回0。

例:

fread(array,4,8,fp); //读入8个实数存放到array中

fwrite(array,4,8,fp); //将前8个实数依次写入fp指向的文件中

五、格式化读写函数 ----【 磁盘文件】

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

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

函数fscanf和函数scanf等价看,只是fscanf接收将从中读取数据的文件指针作为参数。

函数fprintf和printf等价,只是fprintf还需要一个指向文件的指针,所有数据都写入到这个文件中。

六、随机读写

1、文件定位

rewind(文件指针); //将文件内部的位置指针移到文件开始位置

fseek(文件指针,位移量,起始点); //移动文件内部的位置指针到指定的位置 ( 用于二进制文件;成功时,返回文件位置指针的当前值;出错时,返回-1)

起始点 符号名 数字表示

SEEK_SET ---- 文件的开头 ---- 0

SEEKCUR ---- 文件的当前位 ---- 1

SEEK_END ---- 文件的结尾 ---- 2

ftell(文件指针); // 返回文件位置指针的当前值(从文件头开始算起的字节数,返回为长×××数,若出错为-1)

2、文件的随机读写

移动文件的位置指针后,调用顺序读写函数完成读写,从而达到随机读写的目的。