一、FILE结构体:
#include<stdio.h>
#ifndef _FILE_DEFINED struct _iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前缓冲区的相对位置 char *_base; //指基础位置(文件的起始位置) int _flag; //文件标志 int _file; //文件的有效性验证 int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取 int _bufsiz; //文件的大小 char *_tmpfname; //临时文件名 }; typedef struct _iobuf FILE; #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("\nerror on open c:\\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、文件的随机读写
移动文件的位置指针后,调用顺序读写函数完成读写,从而达到随机读写的目的。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。