文件IO和标准IO有什么区别
文件IO:是直接调用内核提供的系统调用函数,头文件是 ,unistd.h
标准IO:是间接调用系统调用函数,头文件是,stdio.h
缓存
概念:
每打开一个文件,内核在内核空间也会开辟一块缓存,这个叫内核空间的缓存。
文件IO中的写,即是将用户空间中的缓存写到内核空间的缓存中。
文件IO中的读,即是将内核空间的缓存写道用户空间的缓存中
标准的IO的库函数中也有一个缓存,这个缓存称为—库缓存。
C库缓存的特点:
1、遇到\n时,会将库缓存的内容写到内核缓存中,
即调用了系统调用函数。
2、库缓存写满时,会调用系统调用函数,
将库缓存内容写到内核缓存中。
缓存分类(读写函数):
1、行缓存,遇到换新行(\n),或者写满缓存时,即调用系统调用函数。
读:fgets,gets,printf,fprintf
写:fputs,puts,scanf
一个字符的读写
读:fgetc,getc,getchar
写:fputc,putc,putchar
2、无缓存,只要用户调这个函数,就会将其内容写到内核中
3、全缓存,只有写满缓存在调用系统调用函数
读:fread
写:fwrite
rewind调整读写位置
fseek()参数与lseek是一样的但是返回值不一样
lseek的返回值是:当前文件的位置指针值;
fseek()的返回值是:成功返回0,失败返回-1;
# rewind(FILE *fp):用于设定流的文件位置指示为文件开始,该函数调用成功无返回值。
# rewind():等价于(void) fseek (fp,0,SEEK_SET);
ftell(FILE *fp):用于取得当前的文件位置,调用成功则为当前文件位置指示,若出错则为-1L;
行缓存的读写函数gets和puts
char *gets(char *s);
int puts(constchar *s);
gets与fgets的区别:
1、gets()时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空间中,从而产生不可预料的后果。
2、gets()只能从标准输入中读
3、gets()与fgets()的另一个区别是,
gets()并不将新行符存入缓存中,
fgets()将新行符存入缓存中;
puts与fputs的区别:
puts()只能向标准输入中写;
puts()和fputs()的另一个区别是:
puts输出时会添加一个新行符,
fputs不会添加。
无缓存
只要用户调这个函数,就会将其内容写到内核中
stderr
全缓存
全缓存 只有写满缓存再调用系统调用函数
读:fread
写:fwrite
行缓存的读写函数fgets和fputs
fgets():
形式:char *fgets (char *s, int size,FILE *stream)
参数说明:
第一个参数:缓存,即读到哪里去
第二个参数:读多少个字节
第三个参数:从什么地方读
返回值:若成功则为s(缓存的地址),若已处文件尾端或出错则为null
fputs():
形式:int fputs(const char *s,FILE *stream);
参数说明:
第一个参数:缓存,即写什么内容
第二个参数:写到哪里去
若成功则为非负值,若出错则为EOF -1 。
刷新缓存函数
ffluash(FIFE *fp)
功能:把库函数中的缓存内容强制写到内核中。
一个字符的读写函数fgetc和fputc
fgetc():
形式:int fgetc(FILE *fp)
功能:从文件中读取一个字符;
参数:文件流
返回值:正确为读取的字符,到文件结尾或出错时返回EOF。
fputc():
形式:int fputc(int c, FILE *fp)
功能:写一个字符到文件中
参数:第一个参数为要写的字符,第二个参数为文件流
返回值:成功则返回输入的字符,出错返回EOF。
注意:fputc有缓存,但不是行缓存函数
部分函数
feof():
形式:int feof(FILE *stream);
功能:判断是否已经到文件结束
参数:文件流
返回值:到文件结束,返回为非0,没有则返回0
ferror():
形式:int ferror(FILE *stream);
功能:判断是否读写错误
参数:文件流
返回值:是读写错误,返回为非0,不是则返回0
clearerr():
形式:void clearerr(FILE *stream);
功能:清除流错误
参数:文件流
今日标语:
奋斗不止,成功必来。