好的,同学们,我们书接上回,继续讲我们的C语言标准io,这一次,我会全部讲完,不会再像上一篇一样偷懒了,请同学们拿出小本本,做好笔记。以下函数都在头文件stdio.h中
一. 打开,关闭文件流
1)open()
函数原型:
FILE *fopen(const char *path, const char *mode);
功能:
打开一个文件流。
参数:
path:要打开的文件名
mode:打开文件的标志。
r 只读打开,文件不存在,就会报错, 文件存在,打开后,光标在文件开头
r+ 读写打开,文件不存在,就会报错,文件存在,打开后,光标在文件开头
w 只写打开,文件不存在,就会报错,文件存在,打开后,文件内容就会截短
w+ 读写打开,文件不存在,就会创建, 文件存在,打开后,文件内容就会截短
a 追加打开,文件不存在,就会创建,文件存在,打开后,光标在文件末尾
a+ 追加打开,文件不存在,就会创建, 文件存在,打开后,原始读的位置的开头。 原始写的位置的末尾。
返回值:
成功返回文件指针 FILE * 。失败返回NULL,同时errno被设置。错误信息可用perror打印
2)close()
函数原型:
int fclose(FILE *fp);
功能:
关闭一个文件流。
参数:
fp:要关闭的能够文件的FILE *
返回值:
成功返回0,失败返回-1,同时errno会被设置。
二. 读写文件流
1.一个字符的读写
1.1) fgetc()
函数原型:
int fgetc(FILE *stream);
功能:从stream指定的文件流中读取一个字符
参数:
stream:指定你要读取的文件流
返回值:
成功返回读取到的这个字符的ascii码值,失败返回-1,同时errno被设置
1.2)getc()
函数原型:
int getc(FILE *stream);
功能:从stream指定的文件流中读取一个字符
参数:
stream:指定你要读取的文件流
返回值:
成功返回读取到的这个字符的ascii码值,失败返回-1,同时errno被设置。
看到这里,有同学们就要问了,这两个功能参数一模一样,干撒子要写两个?其实他们实现过成不一样。注意:fgetc是通过函数实现的,getc是通过宏定义实现。
1.3)getchar(void)
功能:从标准的输入流stdin中读取一个字符。
返回值:读取到的这个字符的ascii码值返回。
注:fgets(stdin) <==> getchar()
1.4) fputc()
函数原型:
int fputc(int c, FILE *stream);
功能:往stream指定的文件流中写入一个字符
参数:
c:要写入的那个字符
stream:指定你要写入的文件流
返回值:
成功返回写入到的这个字符的ascii码值, 失败返回-1,同时errno被设置.
1.5)putc()
函数原型 :
int putc(int c, FILE *stream);
fputc的功能,参数是一样的
区别:
fputc:是用函数实现的
putc:是用宏实现的
1.6)putchar()
函数原型:
int putchar(int c);
功能:
往标准的输出流stdout写入c指定的字符
注:putchar(c) <==> fputc(c, stdout)
2.一行字符的读写
2.1)fgets()
函数原型:
char *fgets(char *s, int size, FILE *stream);
功能:从stream指定的文件流中读取字符
参数:
s:指向一块用来保存获取到的数据的空间
size:表示最多获取多少个字节数,size为s的空间的长度
stream:指定要读取的文件流
返回值:
成功返回s的首地址,失败返回NULL。
2.2)gets()
函数原型:
char *gets(char *s);
功能:从标准的输入流stdin中读取字符串
参数:
s:指向一块用来保存获取到的数据的空间。
返回值:
成功返回s的首地址,失败返回NULL。
注: gets没有考虑s指向空间的大小,存在越界的风险。
2.3)fputs()
函数原型:
int fputs(const char *s, FILE *stream);
功能:往stream指定的文件流中写入s指定的数据
参数:
stream:指定你要写入的文件流
s:指向一块空间,用来保存需要写入的数据
返回值:
成功返回一个非负数,失败返回-1。
2.4)puts()
函数原型:
int puts(const char *s);
功能:往标准的输出流stdout中写入s指定的数据,会换行。
参数:
s:指向一块空间,用来保存需要写入的数据
返回值:
成功返回一个非负数,失败返回-1。
三.直接写入和读取
3.1)fread()
函数原型:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从stream指定的文件流中读取nmemb个对象,且每一个对象的大小为size个字节
参数:
ptr:指向一块空间,用来保存读到的数据 (“数组”)
szie:每一个元素的大小
nmemb:元素的个数
stream:指定你要读取的文件流
返回值:
成功返回你实际读到的元素的个数。失败返回-1
栗子:
int main()
{
//打开文件
FILE * fp = fopen("./1.txt", "r");
if(fp == NULL)
{
perror("fopen 1.txt error : ");
return -1;
}
//读取数据
char buf[32]={0};
int re = fread(buf, 8, 3, fp);
printf("re = %d, buf = %sn",re, buf);
//关闭文件
fclose(fp);
}
3.2)fwrite()
函数原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:从stream指定的文件流中写入nmemb个对象, 且每一个对象的大小为size个字节
参数:
ptr:指向一块空间,用来保存要写入的数据 (“数组”)
szie:每一个元素的大小
nmemb:元素的个数
stream:指定你要写入的文件流
返回值:
成功返回你实际写入的元素的个数 ,失败返回-1。
四.其他io函数
4.1)fflush()
函数原型:
int fflush(FILE *stream);
功能:同步stream指定的流
参数:
stream:指定你要同步的文件流
返回值:
成功返回0,失败返回-1。
对于输出流,fflush把写缓冲区的内容写、更新到文件中 (stdout);对于输入流,fflush把读缓冲区的内容直接清空。stream指定为NULL,fflush把进程中所有打开的输出流同步。
栗子:
int main()
{
printf("hello");
fflush(NULL);
while(1);
}
//大家可以把fflush那行删掉再试试,看看结果有什么不同
4.2)fseek()
函数原型:
int fseek(FILE *stream, long offset, int whence);
功能:重置文件流的光标的位置
参数:
stream:指定你要重置光标的文件流
offset:偏移量
whence:基准方式
SEEK_SET :文件开头
新光标的位置 = 文件开头 + offset( >=0 )
SEEK_CUR :当前位置
新光标的位置 = 当前位置 + offset( 可正可负 )
SEEK_END :文件末尾
新光标的位置 = 文件末尾 + offset( 可正可负 )
返回值:
成功返回0,失败返回-1,同时errno被设置
4.3)feof()
函数原型:
int feof(FILE *stream);
功能:用来判断stream文件流是否结束
参数:
stream:指定你要判断的文件流
返回值:
返回真(非0),文件到达末尾
返回假(0),文件没有到末尾
注:标准IO库,在读到文件末尾时,会自动往缓冲区中填入一个EOF。
格老子的,终于写完了,奈斯你个奈斯,请同学们做好笔记,评论区检查笔记哦!!



