fopen\fread\fwrite\fscanf\fprintf\fseek\feof\rewind\fgets\fputc等系列函数使用总结

时间:2021-09-12 08:41:02
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)。