//当一个程序执行时,C语言自动为其打开三个面向终端的文件流,即自动提供三个文件流指针stdin,stdout,stderr
//***************文件流*************
//1.标准输入(stdin)-scanf函数其实是从标准输入流读取数据
//2.标准输出(stdout)-printf函数其实是向标准输出流写入数据
//3.标准错误输出(stderr)-编译器提示的的warning和error其实是将对应的信息写入标准错误输出
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc, char** argv)
{
//***************************************************************************
//前面的几个对于文件的操作中,当打开文件失败时,我们使用printf将信息写入标准输出流
//在这里,我们将其写入标准错误输出流
FILE* fp;
if ((fp = fopen("hello.txt", "r")) == NULL) //并没有创建此文件,打开失败,返回NULL指针
{
printf("标准输出:打开文件失败\n"); //错误信息输出到标准输出流中,打印到终端
fputs("标准错误输出:打开文件失败\n", stderr); //错误信息输出到标准错误输出流中,其实也会打印中终端中,这里看不出与printf有什么区别
}
//linux中可使用重定向将信息输出到指定文件中,分别开标准输出与标准错误输出,参考http://c.biancheng.net/view/942.html
//windows类似:参考 https://www.cnblogs.com/shawnchou/p/10929535.html
//******在windows PowerShell中运行exe,并将错误信息输出重定向到文件output.txt中,如下图所示
//***************************************************************************
//每个文件流对象都有两个指示器,文件结束指示器(eof)(读取到文件尾的时候,指示器被点亮(eof设置为非0值))
//错误指示器,操作文件出错,该指示器被设置为非0
if ((fp = fopen("test.txt", "r")) == NULL) //创建test.txt,并使用r方式打开
{
printf("标准输出:打开文件失败\n"); //错误信息输出到标准输出流中,打印到终端
}
int ch;
while (1)
{
ch = fgetc(fp); //读取文件内容,每次读取一个字符(unsigned char)
if (feof(fp)) //是否读到文件末尾
{
break;
}
putchar(ch); //打印读取到的字符
}
fputc('c', fp); //测试错误指示器,以r方式打开不能写入,会出错
if (ferror(fp)) //如果错误指示器被设置为非0
{
fputs("出错了\n", stderr);
}
//使用clearerr函数可以人为清除文件末尾指示器和错误指示器的状态,即设置为0
clearerr(fp); //清除指示器为0
if (feof(fp) || ferror(fp))
{
printf("指示器被设置\n"); //不会输出这句
}
fclose(fp); //关闭文件
//***************************************************************************
//ferror函数只能检测是否出错,无法获取错误原因,大多数系统函数在出现错误的时候会将错误原因记录在错误码errno中
//使用perror可以直观打印错误信息,传入的参数显示在具体错误信息的前面
//strerror函数直接返回错误码errno对应的错误信息,利用此函数比perror更灵活
if ((fp = fopen("hello.txt", "r")) == NULL) //并没有创建此文件,打开失败,返回NULL指针
{
printf("标准输出:打开文件失败,原因是:%d\n",errno);//标准输出:打开文件失败,原因是:2 此时错误码为2
perror("具体原因是:"); //具体原因是:: No such file or directory (perror输出:冒号空格和具体错误原因)
fprintf(stderr, "出错啦,原因是:%s", strerror(errno));//将错误信息格式化输出到标准错误输出流中
}
//fclose(fp); 前面打开文件失败,这里关闭会出错
system("pause");
return 0;
}
linux中可使用重定向将信息输出到指定文件中,可以区分开标准输出与标准错误输出,参考http://c.biancheng.net/view/942.html
windows类似:参考 https://www.cnblogs.com/shawnchou/p/10929535.html
******在windows PowerShell中运行exe,并将错误信息输出重定向到文件output.txt中,如下图所示

网友评论