文件流
- 标准输入流(stdin)
- 标准输出流(stdout)
- 标准错误输出流(stdderr)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
FILE *fp;
if((fp = fopen("bucunzai.txt","r") == NULL))
{
fputs("打开文件失败!\n",stderr);
exit(EXIT_FAILURE);
}
fclose(fp);
return 0;
}
重定向
由于标准输出和标准错误输出通常都是直接打印到屏幕上,为了区分它们,可以使用Linux shell的重定向功能:
- 重定向标准输入使用 <
- 重定向标准输出使用 >
- 重定向标准错误输出使用 2>
错误处理
- 错误指示器——ferror
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int ch;
if((fp = fopen("bucunzai.txt","r") == NULL))
{
fputs("打开文件失败!\n",stderr);
exit(EXIT_FAILURE);
}
while(1)
{
ch = fgetc(fp);
if(feof(fp))
{
break;
}
putchar(ch);
}
fputc('c',fp);
if(ferror(fp))
{
fputs("出错了!\n",stderr);
}
fclose(fp);
return 0;
}
-
使用clearerr函数可以人为地清除文件末尾指示器和错误指示器的状态
-
ferror函数只能检测是否出错,但无法获取错误原因。不过,大多数系统函数在出现错误的时候会将错误原因记录在errno中。
-
perror函数可以直观地打印出错误原因
perror:
#include <stdio.h>
#include <stdlib.h>
//#include <errno.h>
int main(void)
{
FILE *fp;
if((fp = fopen("不存在.txt","r"))== NULL)
{
perror("打开文件失败,原因是");
exit(EXIT_FAILURE);
}
fclose(fp);
return 0;
}
结果:
- strerror函数直接返回错误码对应的错误信息
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main(void)
{
FILE *fp;
if((fp = fopen("不存在.txt","r"))== NULL)
{
fprintf(stderr,"出错了,原因是 -> %s <- \n",strerror(errno));
exit(EXIT_FAILURE);
}
fclose(fp);
return 0;
}
结果:
IO缓冲区
-
标准IO提供的三种类型的缓冲模式:
按块缓存
按行缓存
不缓存 -
按块缓存也成为全缓存,即在填满缓冲区后才进行实际的设备读写操作
-
按行缓存是指在接收到换行符(‘\n’)之前,数据都是先缓存在缓冲区的
-
不缓存,也就是允许你直接读写设备上的数据