转载自:http://blog.csdn.net/xidianzhimeng/article/details/23541289
1 fopen
函数原型:FILE * fopen(const char * path,const char * mode);
返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。
fopen_s,_wfopen_s安全性上相对于fopen有所增强,如果成功则返回0,失败则返回响应的错误代码
errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );
errno_t _wfopen_s( FILE** pFile, const wchar_t *filename, const wchar_t *mode );
使用文件的方式共有12种
|
方式
|
意 义
|
|
"rt"
|
只读打开 文本文件
|
|
"wt"
|
只写打开或建立 文本文件
|
|
"at"
|
追加打开 文本文件
|
|
"rb"
|
只读打开 二进制文件
|
|
"wb"
|
只写打开或建立 二进制文件
|
|
"ab"
|
追加打开 二进制文件
|
|
"rt+"
|
读写打开 文本文件
|
|
"wt+"
|
读写打开或建立 文本文件
|
|
"at+"
|
读写打开文本文件,可追加
|
|
"rb+"
|
读写打开二进制文件
|
|
"wb+"
|
读写打开或建立二进制文件
|
|
"ab+"
|
读写打开二进制文件,可追加
|
说明:
1. 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
r(read) 读 w(write) 写 a(append) 追加 + 读和写
t(text) 文本文件,可省略不写 b(banary) 二进制文件
2. 用"r"打开的文件只能读,且文件必须已经存在。
3. 用"w"打开的文件只能写。 若文件不存在,建立之,否则,覆盖之。
4. 用"a"打开的文件只能写,内容追加。文件必须已经存在,否则出错。
5. 打开文件出错时,fopen将返回 NULL。
6. 对于文本文件,读入内存时转换为二进制形式,写入硬盘时转换为文本形式,转换需要一点点时间。对二进制文件的读写不存在这种转换。
7. 文件使用完毕,应关闭之,以避免数据丢失等错误。
8. 标准输入文件(键盘),标准输出文件(显示器 ),标准出错输出(出错信息)由系统打开,可直接使用。
2 fread和fwrite
函数原型:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
功 能:从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功返回 0。
参 数: buffer用于接收数据的内存地址,大小至少是size*count字节.
size单个元素的大小,单位是字节
count元素的个数,每个元素是size字节.
stream输入流
返回值:实际读取的元素个数.如果返回值与count不相同,则可能文件结尾或发生错误.
函数原型:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)stream:目标文件指针;
(5)返回实际写入的数据项个数count。
说明:写入到文件的哪里? 这个与文件的打开模式有关,如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大。
fseek对此函数有作用,但是fwrite函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE *fp)函数同步。
fwrite一般用来写入char*,int*不能直接写。 因为通常我们写入int到文件希望看到效果是一个数,如1,2,3等。但是int占2个或4个字节,用fwrite写入时,一个int是按2个或4个字节写到文件中的,而文件显示时是按一个字节一个字节的显示内容,它不会把4个字节连续起来显示,所以它不可能是1,2,3这样的单字符字样。除了格式化输入fprintf外,还可以进行类型转换,如下所示,但是读取的时候不能使用fread了,只能使用fscanf或fscanf_s函数。
char tmp[100] = {0};_itoa_s(int, tmp, 10);
fwrite(tmp, strlen(tmp), 1, file); fwrite("\t", 1, 1, file);memset(sbuf,0,100);
相对于使用格式化输入,如果循环写数据的话上面的写法较为繁琐了些(5句话使用1句话就可以代替了)
fprintf(file, "%d ", int);
3 fprintf和fscanf
int fprintf(FILE *stream,const char *format,[argument])
fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件. fprintf()只能和printf()一样工作. fprintf()的返回值是输出的字符数,发生错误时返回一个负值.
%d 十进制有符号整数
%i 一个整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
%n 等于读取字符数量的整数
%[] 一个字符集
%% 一个精度符号
int fscanf(FILE* stream,const char *format,[argument...]);
返回值:整型,成功读入的参数的个数
int fscanf_s(FILE* stream,const char *format,[argument...]);
4 fclose,ferror,feof
fclose(文件指针)正常关闭时返回0,否则返回非零。
从ferror和feof获取错误信息或检测是否到达文件结尾
feof文件结束返回非0,否则返回0
5 fseek
int fseek( FILE *stream, long offset, int origin );
第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET文件开头 SEEK_CUR当前位置SEEK_END文件结尾
6 rewind,ftell
原型:void rewind(FILE *stream);
功能:将文件指针重新指向一个流的开头,等同于fseek(stream, 0L, SEEK_SET)
原型:long ftell(FILE *fp)
功能:得到流式文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数。
例子:一般我们会通过下面的方法来获取文件中字符的个数:
FILE *fs=fopen("C:\1.txt","r");//创建文件流
fseek(fs,0,SEEK_END);//将文件内部指针放到文件最后面
length=ftell(fs);//读取文件指针的位置,得到文件字符的个数
rewind(fs);//将文件指针重置到文件最前面
7 fgetc/fputc/fgets/fputs
fgetc函数
(1)一般调用形式 ch=fgetc(fp);
(2)作用 从指定的文件读入一个字符,即从fp所指向的文件中读入一个字符赋给ch。
(3)返回值
成功:返回值所得到的字符; 失败:返回EOF(-1)。
fputc函数
(1)一般调用形式 fputc(ch,fp);
(2)作用 把一个字符写到磁盘文件上去,即将字符ch输出到fp所指向的文件中去。
(3)返回值
成功:返回值就是输出的字符; 失败:返回EOF(-1)。
说明:函数putchar()是在stdio.h中用预处理命令定义的宏,即:
#define putchar(c) fputc(c,stdout)
char *fgets(char *str, int num, FILE *fp)
参数说明:str: 保存从文件读取出来的字符串
fp: 待读文件的文件指针
num: 表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'
int fputs(const char * s,FILE * stream)
功 能:向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)。成功写入一个字符串后,文件的位置指针会自动后移,函数返回为一个非负整数;否则返回EOF(符号常量,其值为-1)。