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种标准的流。
名称 描述 例子
- stdin 标准输入 键盘
- stdout 标准输出 屏幕
- stderr 标准错误 屏幕
- stdprn 标准打印机 LPT1端口
- 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() 用法相关推荐
- matlab fopen函数的用法,matlab中fopen函数与fprintf用法
matlab中fopen函数在指定文件打开的实例如下: *1)"fopen"打开文件,赋予文件代号. 语法1:FID= FOPEN(filename,permission) 用指定 ...
- 用zlib库读取单个压缩文档[转]
Linux程式设计入门 - zlib的运用 发布于2005-05-28 被读1104次 [字体:大 中 小] gzip(*.gz)档案格式几乎是Linux下的标准格式了,有人认为bzip2的压缩率比g ...
- zlib库使用简单讲解
1.zlib库简介 zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity).zlib 也支持读写 gzip (.gz) 格式的文 ...
- int数据类型matlab,MATLAB学习笔记—数据类型
数据类型(Datatypes) 同其他的编程语言一样,MATLAB也有许多的数据类型.下面我们来看看我们用过哪些数据类型. class(arg)可以返回arg的类型.如: >> class ...
- 【240行拿下】基于C语言 实现通讯录管理系统 带文件保存及读取功能
一 首言 学校布置的小作业希望对你有帮助,完整代码在文章结尾为方便阅读代码基本都有注释.代码是在满足老师要求下,尽量减少功能和代码方便同学理解的思想上完成的 (完成7个功能,功能性代码 ...
- zlib库介绍三:gzip(.gz格式)文件读写
gzip格式文件是一个数据压缩文件,文件大体上分为头部.数据部和尾部. 头部和尾部主要是一些文档属性和校验信息(rfc1952),数据部主要是用deflate方法压缩得到的数据. zlib开源库使用的 ...
- php fprintf,PHP fprintf()函数用法讲解
PHP fprintf() 函数 实例 把一些文本写入到名为 "test.txt" 的文本文件: $number = 9; $str = "Beijing"; ...
- fprintf函数的用法_MATLAB的21种特殊符号,总有一种你不知道的用法
本文所指的特殊符号是指除了字母.数字.运算符以外的符号,包括:=;(), []:.{}''""%@~.../*!?..+.我尽量先从常见的符号说起,非新手可以跳过前面的常见符号. ...
- fprintf函数的用法matlab_极力推荐这个Matlab教程
点击蓝字 关注我们 儿童节快乐 前些日子, 由于一些原因的需要, 又把曾经的毕业论文拿来, 改吧改吧, 发现有些地方真的惨目忍睹, 只怪当时太年轻, 没想到给自己挖了一个大坑, 不,, 应该称之为巨坑 ...
- fprintf fscanf等函数的用法
fprintf fscanf等函数的用法 对文件的读和写是最常用的文件操作.在C语言中提供了多种文件读写的函数: ·字符读写函数 :fgetc和fputc ·字符串读写函数:fgets和fputs · ...
最新文章
- 跑yolo3模型出的效果图_效果图和效果图设计到底有什么区别?区别大着呢,亲……...
- 使用iCarousel的旋转木马效果请求图片
- 换个角度入门 K8s
- java读取dat_使用在eclipse java.io库,以便能的FileInputStream读取dat文件
- Postman测试接口传入List类型的参数以及数组类型参数
- bzoj 4498: 魔法的碰撞(DP+组合数)
- python之父名言_Python之父:为什么操作符很有用?
- java中对象的克隆
- 数字图像处理第三版(冈萨雷斯)笔记,2020
- 亲测有效,推荐4款好用的录屏软件
- 求 HCDA认证题库
- 50、LOLNeRF: Learn from One Look
- linux中pe中文名称,原来如此,Linux系统也有PE,不过它叫...
- 结对项目——可循环的最大子数组
- 货郎问题(暴力求解)
- STM32-RCC的功能和使用
- OpenXml开发-基本环境
- 直流无刷风扇引脚说明
- 伏达NU1680:单芯片解决TWS耳机仓无线充电方案
- python机器视觉车牌识别_2车牌识别与深度学习