我是靠谱客的博主 兴奋故事,最近开发中收集的这篇文章主要介绍关于LINUX C库函数 中的 fprintf,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

初学linux C库,能见到它的原型如下:
int fprintf(FILE*stream,const char *format,...)
 

查程序例时,见到如下调用:
fprint(stderr,"Cannot open output file.n");

见百度文库“fprintf详解”:
  fprint()与printf()函数相比多出来了第一个参数FILE*stream,其意义是将打印的内容输出到文件流指针stream所指向的流。所谓流通常是指程序输入或输出的一个连续的字节序列,设备(例如鼠标、键盘、磁盘、屏幕、调制解调器和打印机)的输入和输出都是用流来处理的,在C语言中,所有的流均以文件的形式出现——不一定是物理磁盘文件,还可以是对应于某个输入/输出源的逻辑文件。C语言提供了5种标准的流,你的程序在任何时候都可以使用它们,并且不必打开或者关闭它们。(以下列出了这5种标准的流。

     名称        描述              例子

  1. stdin     标准输入         键盘
  2. stdout     标准输出          屏幕
  3. stderr    标准错误          屏幕
  4. stdprn     标准打印机       LPT1端口
  5. stdaux     标准串行设备     COM1端口

  其中,stdprn和stdaux并不是总是预先定义好的,因为LPT1和COM1端口在某些操作系统中是没有意义的,而stdin,stdout和 stderr 总是预先定义好的此外stdin并不一定来自键盘,stdout也并不一定显示在屏幕上,他们都可以是重定向到磁盘文件或其他设备上。我们在头文件stdio.h中可以找到stdin,stdout和stderr的定义如下:

extern struct _IO_FILE *stdin;

extern struct _IO_FILE *stdout;
extern struct _IO_FILE *stderr;

 在使用fprintf()函数的时候,通常我们可以设第一个参数为stdout或者stderr,打印出错调试信息的时候则推荐使用stderr而不是stdout(当输出的信息是错误反馈时),这是一种惯例,同时也由于内核在处理stdout和stderr时优先级不一样,后者的优先级要高一些,因此有时候如果程序异常退出时,stderr能得到输出,而stdout就不行。

printf(...)实际上相当于fprintf(stdout,...),这也是我们为什么不推荐使用它的原因。在输出调试信息的时候,我们推荐使用fprintf(stderr,...),或者使用某个指定的文件流
fprintf(some_stream,...)。
 那么具体如何在必要的时候重定向fprintf()中的调试信息呢?来看看下面一些方法:

 当调试信息的量比较大,需要一些时间或者其他辅助工具来搜索过滤时,仅仅利用显示屏幕来输出调试的信息是不够的,这是我们经常将这些信息输出到所谓的日志文件(log)中,之后再自己分析log文件发现问题

利用Shell的I/O重定向(这个就够用了)

简单的些log方法可以通过shell的I/O重定向机制来实现,比如下面的代码:

#include<stdio.h>

int main()

{

fprintf(stdout,"This is a standard output info!n");

fprintf(stderr,"This is a standard error output info!n");

return 0;

}

在默认条件下,编译运行的结果总是打印信息输出在屏幕上:

$gcc fprint.c -o fprint

$./fprint

This is a standard output info!

This is a standard error output info!

这是因为默认情况下,shell所打开的stdout和stderr设备都是显示屏幕。不过我们可以通过shell的重定向功能来将打印信息写到文件中去。比如:

$./fprint>output.log【这个语法可以在C编程语言第二版书摘的输入输出章节可见,用于把输出定向到文件】

This is a standard error output info!

$cat output.log

This is a standard output info!

这样,我们把stdout的输出写到了文件output.log中,不过stderr的输出还是在屏幕上。如何重定向stderr呢?着需要用到shell定义的文件描述符。在shell下stdin,stdout和stderr的文件描述符分别是0,1和2,我们可以用下面的方法重定向:

$./fprint>output.log2>error.log

$cat output.log

This is a standard output info!

$cat error.log

This is a standard error output info!

$

$./fprint>output.log2>&1

$cat output.log

This is a standard error output info!

This is a standard output info!

其中./fprint >output.log 2>error.log分别将stdout 和 stderr 的输入写到文件output.log 和error.log中,而./fprint>output.log2>&1则表示将stderr的输出追加到stdout的文件output.log中(结果是output.log 中既有 stdout输出 也有stderr输出)。

一些常用的shell I/O 语法如下:

cmd > file 把 stdout 重定向到 file 文件中

cmd>> file 把 stdout 重定向到 file文件中(追加)

cmd1 > file 把 stdout 重定向到 file 文件中

cmd> file2>&1 把stdout 和stderr 一起重定向到 file文件中

cmd 2>file 把 stderr重定向到file 文件中

cmd 2>>file 把 stderr重定向到file文件中(追加)

cmd>>file2>&1 把 stderr和stdout 一起重定向到file 文件中(追加)

在平时简单的调试中,我们可以灵活利用这些方法来快速得到log文件。

 

用freopen()进行重定向

有时候我们要求在程序中能够控制标准流的重定向,这是可以利用标准C库函数freopen().

freopen()的函数原型如下:

 FILE *freopen(const char *filename,)

下面的代码用来测试用函数freopen()重定向stderr:

#include<stdio.h>

int main()

{

if(freopen("err.log",w,stderr)==NULL)

fprintf(stderr,"error redirecting stderrn");

fprintf(stdout,"This is a standard output info!n");

fprintf(stderr,"This is a standard error output info!n");

fclose(stderr);

return 0;

}

 其中我们用freopen()函数将stderr重定向到了"err.log"文件,这样的得到的记过如下:

$gcc print_log.c -o print_log

$./print_log

This is a standard output info!

$cat err.log

This is a standard error output info!

可见第八行打印到stderr的信息被重定向到了err.log文件中,而第七行stdout的打印星系则还是输出到了屏幕上。


原文

http://blog.sina.com.cn/s/blog_6ddef98f0100vm8x.html


最后

以上就是兴奋故事为你收集整理的关于LINUX C库函数 中的 fprintf的全部内容,希望文章能够帮你解决关于LINUX C库函数 中的 fprintf所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部