美文网首页
标准流和错误处理

标准流和错误处理

作者: lxr_ | 来源:发表于2021-11-08 17:25 被阅读0次
//当一个程序执行时,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中,如下图所示

windows重定向

相关文章

  • 标准流和错误处理

    linux中可使用重定向将信息输出到指定文件中,可以区分开标准输出与标准错误输出,参考http://c.bianc...

  • 2018-09-19 day3 css布局

    1.标准流和display属性 1.1标准流 1.标准流:浏览器对标签默认的布局方式就是标准流2.标准流布局原则:...

  • 浮动和标准流

    1.设计稿 清空所有的边距 从外向内,从上面到下 2.网页布局方式 1)标准流排版方式 【1】浏览器默认的方式 【...

  • 2018-09-19 day3 CSS布局

    1.标准流和display属性 1.标准流:浏览器对标签默认的布局方式就是标准流2.标准流则:块级:a.块级标签一...

  • 2018-09-19CSS布局

    一、标准流和display属性 1.标准流:浏览器对默认的布局方式就是标准流 2.标准流布局原则: 块级: a.块...

  • 第二阶段day3总结

    一、标准流和display属性: 1.标准流:浏览器对标签默认的布局方式就是标准流2.标准流布局原则:块级:a.块...

  • 2018-09-19day3-CSS布局

    一、标准流和display属性 1.标准流 浏览器对标签默认的布局方式就是标准流 2.标准流布局原则 块级:a.块...

  • 2018-09-19day3CSS布局

    一、标准流和display属性 1.标准流:浏览器对默认标签默认的布局方式就是标准流2.标准流布局原则:块级:a....

  • CSS布局

    一.标准流和display 1.标准流:浏览器对标签默认的布局方式就是标准流2.标准流布局原则块级:a.块级标签一...

  • Day003 - CSS属性(2018-10-31)

    一、标准流和浮动 1.标准流 标准流布局:在标准流中,块级标签是一个占一行,默认宽度是父标签的宽度,默认高度是内容...

网友评论

      本文标题:标准流和错误处理

      本文链接:https://www.haomeiwen.com/subject/pqfnaltx.html