您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
c语言中输出错误的两种方法fprintf与printf的区别为什么fprintf比较好?
发布时间:2021-04-20 21:49:00编辑:雪饮阅读()
首先我们看一个最简单用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流即和标准错误输出流一样也是默认输出在控制台的),但是重定向之后的文本中是有错误信息的。
因为这次是将错误信息输出在标准输出的,而这个重定向语句也正好是标准输出的重定向,所以控制台中没有错误信息了,反而是重定向之后的文本文件中有错误信息了
关键字词:c,c语言,fprint,fprintf,标准错误输出