标准高级I/O
一、文件流指针和fopen函数
FILE *fp = fopen(const char *path, const char *mode);
第一个参数(path):打开文件的路径和文件名
第二个参数(mode):打开文件的方式
mode | 功能 |
---|---|
b | 二进制文件 |
r | 以制度方式打开文件,文件必须存在 |
w | 以只写覆盖方式打开文件,文件不存在则创建 |
a | 以只写追加方式打开文件,文件不存在则创建 |
r+ | 以读写方式打开文件,文件必须存在 |
w+、a+ | …读写方式… |
另外,stdio.h头文件把三个文件指针与三个标准文件相关联,C程序会自动打开这三个标准文件。
标准文件 | 文件指针 | 常用功能 | 类型 |
---|---|---|---|
标准输入 | stdin | 从键盘输入 | |
标准输出 | stdout | 从显示器输出 | 行缓存 |
标准错误 | stderr | 从现实器输出 | 无缓存 |
这些指针都是指向FILE的指针,可以将其用作标准I/O的参数,也就是和fp是同一种性质。
返回值:文件流指针
二、读写函数
1.行缓存的读写函数(出现"\n"或写满标准库分配的缓存才会调用系统调用函数)
写函数:
puts、fputs、scanf
以fputs为例:
int fputs(const char *s, FILE *stream);
例如:
int main()
{
fputs("hello world!", stdout);//stdout表示标准的输出
while(1);
return 0;
}
在此程序中,只有在hello world后面加"\n"才能输出到显示屏上,即验证了fputs是行缓存
读函数:
gets、fgets、printf、sprintf、fprintf
以fgets为例:
char *fgets(char *s, int size, FILE *stream);
例如:
int main()
{
char rd_buf[128] = {0};
fgets(rd_buf, 128, stdin);//从标准输入中去读,即从键盘输入
fputs(rd_buf, stdout);//写到标准输出中去,即显示屏显示
return 0;
}
此程序运行后会从键盘输入后从显示器输出。
2.全缓存读写函数(只有写满标准库分配的缓存才会调用系统调用函数)
1.fwrite
2.fread
三、刷新缓存函数(fflush(FILE *stream))
功能:把库函数中的缓存强制写到内核中去。
例如:
int main()
{
fputs("hello world!", stdout);//stdout表示标准的输出
fflush(stdout);
while(1);
return 0;
}
就算hello world后面不加"\n",也会将其输出到显示器上。
四、fclose函数
功能:在改文件被关闭之前,刷新缓存中的数据,释放标准I/O库为其分配的缓存。
例如:
int main()
{
fputs("hello world!", stdout);//stdout表示标准的输出
fclose(stdout);
while(1);
return 0;
}
其作用和fflush相同,因为fclose函数里包含了fflush函数。
五、读写位置指针函数
1.fseek函数
int fseek(FILE *stream, long offset, int whence);
whence | 说明 |
---|---|
SEEK_SET | 调整位置指针到开头 |
SEEK_CUR | 调整位置指针为当前位置 |
SEEK_END | 调整位置指针到末尾 |
2.rewind函数
void rewind(FILE *stream);
功能:
等价于(void)fseek(FILE *stream, 0, SEEK_SET);
六、其他函数
1.feof函数:判断是否已经到达文件结尾
2.ferror函数:判断是否读写错误
3.clearerr函数:清除流错误