初学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.log 2>error.log

$cat output.log

This is a standard output info!

$cat error.log

This is a standard error output info!

$

$./fprint>output.log 2>&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.log 2>&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 > file 2>&1 把 stdout 和stderr 一起重定向到 file 文件中

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

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

cmd >>file 2>&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 stderr\n");

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的打印星系则还是输出到了屏幕上。

fprintf() 用法相关推荐

  1. matlab fopen函数的用法,matlab中fopen函数与fprintf用法

    matlab中fopen函数在指定文件打开的实例如下: *1)"fopen"打开文件,赋予文件代号. 语法1:FID= FOPEN(filename,permission) 用指定 ...

  2. 用zlib库读取单个压缩文档[转]

    Linux程式设计入门 - zlib的运用 发布于2005-05-28 被读1104次 [字体:大 中 小] gzip(*.gz)档案格式几乎是Linux下的标准格式了,有人认为bzip2的压缩率比g ...

  3. zlib库使用简单讲解

    1.zlib库简介 zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity).zlib 也支持读写 gzip (.gz) 格式的文 ...

  4. int数据类型matlab,MATLAB学习笔记—数据类型

    数据类型(Datatypes) 同其他的编程语言一样,MATLAB也有许多的数据类型.下面我们来看看我们用过哪些数据类型. class(arg)可以返回arg的类型.如: >> class ...

  5. 【240行拿下】基于C语言 实现通讯录管理系统 带文件保存及读取功能

    一 首言         学校布置的小作业希望对你有帮助,完整代码在文章结尾为方便阅读代码基本都有注释.代码是在满足老师要求下,尽量减少功能和代码方便同学理解的思想上完成的 (完成7个功能,功能性代码 ...

  6. zlib库介绍三:gzip(.gz格式)文件读写

    gzip格式文件是一个数据压缩文件,文件大体上分为头部.数据部和尾部. 头部和尾部主要是一些文档属性和校验信息(rfc1952),数据部主要是用deflate方法压缩得到的数据. zlib开源库使用的 ...

  7. php fprintf,PHP fprintf()函数用法讲解

    PHP fprintf() 函数 实例 把一些文本写入到名为 "test.txt" 的文本文件: $number = 9; $str = "Beijing"; ...

  8. fprintf函数的用法_MATLAB的21种特殊符号,总有一种你不知道的用法

    本文所指的特殊符号是指除了字母.数字.运算符以外的符号,包括:=;(), []:.{}''""%@~.../*!?..+.我尽量先从常见的符号说起,非新手可以跳过前面的常见符号. ...

  9. fprintf函数的用法matlab_极力推荐这个Matlab教程

    点击蓝字 关注我们 儿童节快乐 前些日子, 由于一些原因的需要, 又把曾经的毕业论文拿来, 改吧改吧, 发现有些地方真的惨目忍睹, 只怪当时太年轻, 没想到给自己挖了一个大坑, 不,, 应该称之为巨坑 ...

  10. fprintf fscanf等函数的用法

    fprintf fscanf等函数的用法 对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数: ·字符读写函数 :fgetc和fputc ·字符串读写函数:fgets和fputs · ...

最新文章

  1. 跑yolo3模型出的效果图_效果图和效果图设计到底有什么区别?区别大着呢,亲……...
  2. 使用iCarousel的旋转木马效果请求图片
  3. 换个角度入门 K8s
  4. java读取dat_使用在eclipse java.io库,以便能的FileInputStream读取dat文件
  5. Postman测试接口传入List类型的参数以及数组类型参数
  6. bzoj 4498: 魔法的碰撞(DP+组合数)
  7. python之父名言_Python之父:为什么操作符很有用?
  8. java中对象的克隆
  9. 数字图像处理第三版(冈萨雷斯)笔记,2020
  10. 亲测有效,推荐4款好用的录屏软件
  11. 求 HCDA认证题库
  12. 50、LOLNeRF: Learn from One Look
  13. linux中pe中文名称,原来如此,Linux系统也有PE,不过它叫...
  14. 结对项目——可循环的最大子数组
  15. 货郎问题(暴力求解)
  16. STM32-RCC的功能和使用
  17. OpenXml开发-基本环境
  18. 直流无刷风扇引脚说明
  19. 伏达NU1680:单芯片解决TWS耳机仓无线充电方案
  20. python机器视觉车牌识别_2车牌识别与深度学习

热门文章

  1. IIS部署,发布网站精选
  2. JAVA透视相机安卓_透视相机下载安卓版
  3. Games102_lecture8几何建模与处理基础_离散微分几何,Utopia框架介绍
  4. paypal php 开发,PHP语言开发Paypal支付demo的具体实现
  5. PS常用快捷键 初学者必看
  6. 加拿大卡尔加里市推出本地数字货币
  7. 关于方法A调用方法B的事务控制问题
  8. 输入一个正整数n(n<360),输出n度的正弦余弦值
  9. java并发编程 第二期 CAS
  10. 新手学编程,是学c还是java呢?