知识点——标准IO
标准io:stdio 属于c库,可移植性强。而系统IO只属于Linux。
标准IO 有缓冲区:全缓冲、行缓冲、无缓冲,系统IO无缓冲区。
标准io的实质还是通过C库函数去调用系统IO。
标准IO函数:字符、字符串读写
fopen fclose 文件打开关闭
fread fwrite 文件读写
fgets fputs 从文件中读取/输出字符串
gets puts 获取、输出字符串
fgetc fputc 从文件中获取、输出字符
getc putc 终端输出输入一个字符
getchar putcahr
fscanf fprintf 格式化输入输出、从文件
sscanf sprintf 从字符串
scanf printf 从终端
fflush 冲刷缓存区(全缓冲、含缓冲)
fseek ftell rewind 光标定位
feof 文件末尾
对应函数解析:
fpoen函数——打开文件
FILE * fopen(const char * path, const char * mode);
返回值:成功返回一个文件流指针,失败返回一个负数的错误码。
fclose函数——关闭一个文件
int fclose( FILE *fp );
返回值:成功返回0,失败返回-1.errornum被设置。
fread函数——从文件流中读取数据
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
返回值:成功返回成功读取的字节数,失败返回一个错误码,读取字节数小于count、需要判断是否为EOF;
fwrite函数
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。
要注意:写和读取的位置与打开文件时候的属性有关系。
打开文件的权限:
r | 以只读方式打开文件,该文件必须存在。 |
r+ | 以读/写方式打开文件,该文件必须存在。 |
rb+ | 以读/写方式打开一个二进制文件,只允许读/写数据。 |
rt+ | 以读/写方式打开一个文本文件,允许读和写。 |
w | 打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件。 |
w+ | 打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 |
a | 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF 符保留)。 |
a+ | 以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的 EOF 符不保留)。 |
fgets/fputs
char *fgets(char *buf, int bufsize, FILE *stream);
*buf: 字符型指针,指向用来存储所得数据的地址。
bufsize: 整型数据,指明存储数据的大小。
*stream: 文件结构体指针,将要读取的文件流。
成功,则返回第一个参数buf;
在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;
如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。
int fputs(const char *str, FILE *stream);
返回值:该函数返回一个非负值,如果发生错误则返回 EOF(-1)。
(1)str:这是一个数组,包含了要写入的以空字符终止的字符序列。
(2)sstream:指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流
注意:从文件流中读取一个字符或者字符串的时候光标会随之改变。
函数名: fflush
功 能: 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时
头文件:stdio.h
原型:int fflush(FILE *stream)
其中stream是要冲洗的流
如果成功刷新,fflush返回0。指定的流没有缓冲区或者只读打开时也返回0值。失败返回EOF指出一个错误。
fseek、rewind、ftell函数
int fseek(FILE *stream, long offset, int fromwhere);
用法同lseek;
long ftell(FILE *stream);
返回当前指针距离开始的长度,注意是long型,超过表达范围时候回出现错误。
rewind函数,将一个文件流的指针重新指向开头。
FEOF函数——判断文件指针是否到达末尾
int feof(fp);
如果到达末尾,返回真,如果没有,返回假(0);
格式化IO:
fscanf/fprintf
sscanf/sprintf
scanf/printf
函数名: fscanf
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)。
用法:
1 |
|
FILE *stream:文件指针
char *format:格式字符串
[argument...]:输入列表
int fprintf (FILE* stream, const char*format, [argument])
FILE*stream:文件指针
const char* format:输出格式
[argument]:附加参数列表
ssanf/sprintf
从一个字符串中格式化输入,输出
关于获取字符串fgets,gets 、getc,getchar,fscanf,sscanf,scanf中获取换行符号与空格符号、制表符号的关系。
fscanf sscanf scanf不会读取\n和空格,只会读取连续的字符。
getchar fgetc getc 会获取空格和换行
fgets gets 会获取空格但是不会获取换行,或者到0结束。
注意gets不会在意buf 的大小,可能造成栈的溢出。