暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

c语言中输出错误的两种方法fprintf与printf的区别为什么fprintf比较好?

雪饮个人博客 2021-10-19
2236

 首先我们看一个最简单用printf输出错误的实例


#include <stdio.h>


#include <errno.h>


#include <string.h>


int main ()


{


   FILE * pf;


   二进制“读”模式打开一个不存在的文件


   pf = fopen ("unexist.txt", "rb");


   在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,像是这里的fopen就返回的NULL


   if (pf == NULL)


   {


    /*


      错误号输出:


       在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码 errno,该错误代码是全局变量


       所以这里没有定义errno也能使用


    */


      printf("errno:%d\n", errno);


      *


      错误详情输出:


      strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。所以用%s接收,%s字符串也是指针


      */


      printf("error details:%s\n", strerror( errno ));


   }


   else


   {


      fclose (pf);


   }


   return 0;


}


接下来我们再来看一个fprintf输出错误的实例


#include <stdio.h>


#include <errno.h>


#include <string.h>


int main ()


{


   FILE * pf;


   二进制“读”模式打开一个不存在的文件


   pf = fopen ("unexist.txt", "rb");


   在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,像是这里的fopen就返回的NULL


   if (pf == NULL)


   {


      *


      错误号输出:


   在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码 errno,该错误代码是全局变量


   所以这里没有定义errno也能使用


  


   stderr -- 标准错误输出设备/标准错误输出文件


      fprintf函数用于格式化输出信息到一个流文件中


      fprintf:


         函数原型为int fprintf( FILE *stream, const char *format, [ argument ]...),


         fprintf()函数根据指定的格式(format),向输出流(stream)写入数据(argument)。


   stderr 是系统定义好了的。可以直接用,并且stderr既然是文件,则正好可以用fprintf将错误输出,stderr做为fprintf的第一个参数


      */


      fprintf(stderr, "errno: %d\n", errno);


      *


      错误详情输出:


      perror:


      用来将上一个函数发生错误的原因输出到标准设备(stderr),即输出到标准错误输出中


      该函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。


      */


      perror("perror=>error");


      *


      错误详情输出:


      同样用标准错误输出,将错误信息格式化输出


      strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。所以用%s接收,%s字符串也是指针


      */


      fprintf(stderr, "open file error: %s\n", strerror( errno ));


   }


   else


   {


      fclose (pf);


   }


   return 0;


}


区别与联系


首先从错误输出上,上面两者都是可以正常输出的,没有什么联系或者区别的。


其中perror输出其实和fprintf是一样的都是走的标准错误输出。


其实它们主要区别在于重定向的时候


我们来分别看看它们在重定向时候的表现


s.c使用fprintf输出


s.c:


#include <stdio.h>


#include <errno.h>


#include <string.h>


int main ()


{


   FILE * pf;


   pf = fopen ("unexist.txt", "rb");


   if (pf == NULL)


   {


      fprintf(stderr, "errno: %d\n", errno);


      perror("perror=>error");


      fprintf(stderr, "open file error: %s\n", strerror( errno ));


   }


   else


   {


      fclose (pf);


   }


   return 0;


}


s.c编译并运行且将运行结果重定向


D:\cproject>gcc s.c -o s


 


D:\cproject>s.exe > s.txt


errno: 2


perror=>error: No such file or directory


open file error: No such file or directory


 


D:\cproject>type s.txt


可以发现用fprintf进行错误输出后并重定向运行结果时候,控制台上是会有错误信息的(虽然程序中输出到了标准错误输出流,但是这个流默认是输出在控制台的),但是重定向以后的文本文件中是没有错误信息的


这是因为这里这个重定向语法是以标准输出重定向的,但是我们这里用fprintf输出的错误信息是输出在标准错误输出里面的,所以标准输出是空的


 


p.c使用printf输出


p.c:


#include <stdio.h>


#include <errno.h>


#include <string.h>


int main ()


{


   FILE * pf;


   pf = fopen ("unexist.txt", "rb");


   if (pf == NULL)


   {


      printf("errno:%d\n", errno);


      printf("error details:%s\n", strerror( errno ));


   }


   else


   {


      fclose (pf);


   }


   return 0;


}


p.c编译并运行且将运行结果重定向


D:\cproject>gcc p.c -o p


 


D:\cproject>p.exe > p.txt


 


D:\cproject>type p.txt


errno:2


error details:No such file or directory


可以看到p.c进行错误输出并重定向运行结果后,控制台中已经没有错误信息了(这里的printf方法输出走的就是标准输出stdout流即和标准错误输出流一样也是默认输出在控制台的),但是重定向之后的文本中是有错误信息的。


因为这次是将错误信息输出在标准输出的,而这个重定向语句也正好是标准输出的重定向,所以控制台中没有错误信息了,反而是重定向之后的文本文件中有错误信息了


文章转载自雪饮个人博客,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论