
标准IO常用的接口有:printf、scanf、fopen、fclose、fgetc、fputc、fgets、fputs、fread、fwrite…(由于printf和scanf我们以及很熟悉了本文不再讲解)。
1.1 FILE指针FILE是一个结构体,fopen函数返回的就是一个结构体指针,这个FILE指针记录了打开文件的一切信息,我们在操作文件的时候就通过这个FILE完成。
typedef struct _IO_FILE FILE;
struct _IO_FILE {
char* _IO_buf_base; //缓冲区的起始地址
char* _IO_buf_end; //缓冲区的结束地址
...
}
在一个正在运行的程序中默认已经产生了三个FILE指针
stdin:标准输入,程序从终端读取数据的时候使用 stdout:标准输出,程序向终端输出数据的时候使用 stderr:标准出错1.2 fopen函数
#include1.3 fclose函数FILE *fopen(const char *pathname, const char *mode); 功能:使用标准IO接口打开文件 参数: @pathname:文件的路径和名字 例:"./hello.txt" @mode:文件打开的方式 例:"r","w" 方式有: "r" 以只读的方式打开文件,将光标定位到开头 "r+" 以读写的方式打开文件,将光标定位到开头 "w" 以只写的方式打开文件,若文件不存在则创建文件,若文件 存在则清空文件,将光标定位到开头 "w+" 以读写的方式打开文件,若文件不存在则创建文件,若文件 存在则清空文件,将光标定位到开头 "a" 以追加的方式打开文件,若文件不存在则创建文件,若文件 存在则将光标定位到结尾 "a+" 以读和追加的方式打开文件,若文件不存在则创建文件,若 文件存在不会清空,读的时候光标定位在开头,写的时候光 标定位在结尾 返回值:成功返回FILE指针,失败返回NULL,只为错误码。
#includeint fclose(FILE *stream); 功能:关闭文件 参数: @stream:文件指针 返回值:成功返回0,失败返回EOF(#define EOF (-1)),置位错误码
注:
如果文件没有关闭,在程序结束的时候,操作系统会自动回收
对于文件指针,只能关闭一次,不能关闭多次
如果在一个服务器,打开的文件不关闭,最后就不能够打开新的文件的,因为它属于资源,所以最好自己打开的文件就自己关闭
如果关闭了标准输入(stdin)就不能够在输入了,比如不能够调用scanf函数
如果关闭了标准输出(stdout),不能够使用printf函数
int fgetc(FILE *stream); 功能:从文件中获取一个字符 参数: @stream:文件指针 返回值:成功返回字符的ascii,失败返回EOF int fputc(int c, FILE *stream); 功能:向文件中输入一个字符 参数: @c:要输入的字符 @stream:文件指针 返回值:成功返回字符的ascii,失败返回EOF1.5 fgets/fputs函数
char *fgets(char *s, int size, FILE *stream); 功能:从文件中读取字符串 参数: @s:存储读取到的字符的首地址 @size:想读取的大小 @stream:文件指针 返回值:成功返回s,失败返回NULL int fputs(const char *s, FILE *stream); 功能:向文件中写入字符串 参数: @s:字符串的首地址 @stream:文件指针 返回值:成功返回大于0的值,失败返回EOF1.6 fread/fwrite函数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件中读取数据到ptr中
参数:
@prt:用来存储读取到的数据的首地址
@size:每一项的大小
@nmemb:项目的个数
@stream:文件指针
返回值: 成功返回读到项目的个数,如果每一项的大小为1字节,则返回项目的
个数就是字节的个数
失败返回小于项目的个数或者是0
如果失败需要通过ferror或者feof判断是哪种错误
if(ferror(fp))
{
printf("读的时候发生了错误n");
]
if(feof(fp))
{
printf("读取到文件的结尾了n");
}
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:将ptr中的数据写到文件中
参数:
@ptr:要向文件中写入数据的首地址
@size:每一项的大小
@nmemb:项目的个数
@stream:文件指针
返回值:成功返回向文件中写入项目的个数
失败返回小于项目的个数或者是0
1.7 sprintf/snprintf/fprintf函数
int sprintf(char *str, const char *format, ...); 功能:将字符串格式化到str中,(sprintf在越界输入的时候会发生错误) 参数: @str:储存格式化后的字符串 @format,...:可变参数,和printf里的写法完全相同 返回值:成功返回格式化后的字符个数,失败或遇到错误则返回负值 int snprintf(char *str, size_t size, const char *format, ...); 功能:将字符串格式化到str中 参数: @str:储存格式化后的字符串 @size:输入的字符的个数,最后一个成员包含' ' @format,...:可变参数,和printf里的写法完全相同 返回值:成功返回格式化后的字符个数,失败或遇到错误则返回负值 int fprintf(FILE *stream, const char *format, ...); 功能:将字符串格式化到对应的stream文件中 参数: @stream:文件指针 @format,...:可变参数,和printf里的写法完全相同 返回值:成功返回格式化后的字符个数,失败或遇到错误则返回负值1.8 fseek/ftell/rewind光标操作函数
int fseek(FILE *stream, long offset, int whence);
功能:用来设置光标的位置
参数:
@stream:文件指针
@offset:将光标设置(偏移)到哪里
>0 向后偏移
<0 向前偏移
=0 不偏移
@whence:从哪开始偏移
SEEK_SET 开头
SEEK_CUR 当前位置
SEEK_END 结尾
返回值:成功返回0,失败返回-1,置位错误码
long ftell(FILE *stream);
功能:获取光标到开头的值(单位字符)
参数:
@stream:文件指针
返回值:成功返回光标当前位置到开头的字符个数,失败返回-1,置位错误码
void rewind(FILE *stream);
功能:将光标设置到文件的开头
参数:
@stream:文件指针
返回值:无
rewind(fp);等价于fseek(fp,0,SEEK_SET);
fseek(fp,0,SEEK_END);
ftell(fp);
这两句话就可以统计文件的大小
注:
如果文件是以a+/a的方式打开,通过fseek修改光标的位置,无效。写的内容永远在结尾。但是可以修改读的光标的位置。