stderr,stdin,stdout相关
转载请保留原作者。
一.stdin和stdout
1.意义
stdin表示标准输入,stdout表示标准的输出。它们都是文件指针。默认情况下,所指向的文件是控制台。
可以使用freopen进行重定向,或者fopen新建文件指针,都是可以的。
2.缓冲
2.1.scanf的缓冲问题
#include<stdio.h>
using namespace std;
int main(){
int a;
while(scanf("%d",&a)!=1)printf("error!");
return 0;
}
这段代码的原意是,如果读入不到a,那么就输出error。
但是,stdin中的内容,scanf不是按照行读入字符,而是根据连续的字符流读入字符。因此,如果读入一个非法字符,例如非数字的字符,那么会出问题。因为读入后,scanf发现错误,然后输入error,再次读入下一个字符时,上次的那个字符还残留在流中,因此导致无限输出error。
对于这个做法,有人会使用fflush(stdin),这个问题我们下一章节继续。
2.2.fflush
一般来说,stdout是有缓冲的。缓冲的意思就是先把字符存起来,到达某一时刻,把缓存的字符一次性写入文件。我们知道,硬盘速度比内存慢很多,每写一个就存入一次速度很慢,如果累计起来一次放入速度会提高。
stdout默认是到达换行符刷新。
fflush一般用于输出的缓冲刷新。也就是说,输出到一半,使用fflush可以提前刷新。
但是fflush只能用于输出的刷新,输入流不能这样刷新。fflush(stdin)可能在部分编译器可以刷新输入流,达到上文的scanf刷新,但是标准没有定义这个行为。也就是说,部分编译器是不支持的。
3.freopen
freopen(const char *filename,const char *mode,FILE *stream);
把stream重定向到filename的文件名去。
例如,freopen(“a.txt”,”r”,stdin);表示把a.txt作为输入重定向stdin。这样,默认scanf就会从a.txt读入而不是控制台。
第二个参数mode,表示模式,例如r表示文本读入,w表示文本写入,rb表示二进制读入等。
如果在重定向到文件后,重定向回控制台进行输入输出,可以把filename设置为“CON”即可。
二.stderr
1.输出方法
标准错误流。fprintf(stderr,...);
使用fprintf指定文件指针为stderr,进行输出,默认输出文件还是stdout的文件。也就是说,也可以往控制台输出,输出位置一样的。
2.默认缓冲
让我们写个程序检验一下。
#include<stdio.h>
using namespace std;
int main(){
fprintf(stdout,"stdout ");
fprintf(stderr,"stderr ");
}
输出:stderr stdout
看上去stderr先输出?没错,就是这样,没有换行符的时候,stdout不会自动刷新,但是stderr每写一个字符都要刷新。因此,stderr先输出,程序结束的时候再刷新一次,输出stdout。
如果先加上fflush,那么就是stdout先了。
#include<stdio.h>
using namespace std;
int main(){
fprintf(stdout,"stdout ");fflush(stdout);
fprintf(stderr,"stderr ");
}
stderr,stdin,stdout相关的更多相关文章
- (转)Windows管道(Pipe)重定向stdout,stderr,stdin
参考: http://qiusuoge.com/11496.html http://www.cnblogs.com/BoyXiao/archive/2011/01/01/1923828.html st ...
- WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)
WorkerMan中work.php中 resetStd 方法中代码如下 public static function resetStd() { if (!static::$daemonize || ...
- stdin stdout stderr 标准I/O流
Unix中一切皆文件,磁盘等设备在操作系统来看都是文件. 对文件进行操作时,需要打开这个文件,并获得文件描述符(file descriptor, fd) 而每个进程生来就有三个文件描述符绑定在它身上, ...
- Linux Shell 文件描述符 及 stdin stdout stderr 重定向
Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...
- shell基础知识之 stdin,stdout,stderr和文件描述符
stdin,stdout,stderr stdin=0 stdout=1 stderr=2 使用tee来传递内容,把stdout 作为stdin 传到下个命令 root@172-18-21-195:/ ...
- stdin stdout stderr - 标准 I/O 流
Fd #include <stdio.h> Fd extern FILE *stdin; Fd extern FILE *stdout; Fd extern FILE *stderr; D ...
- file descriptor 0 1 2 一切皆文件 stdout stderr stdin /dev/null 沉默是金 pipes 禁止输出 屏蔽 stdout 和 stderr 输入输出重定向 重定向文件描述符
movie.mpeg.001 movie.mpeg.002 movie.mpeg.003 ... movie.mpeg.099 $cat movie.mpeg.0*>movie.mpeg ...
- stderr和stdout详细解说
今天又查了一下fprintf,其中对第一个参数stderr特别感兴趣. int fprintf(FILE *stream,char *format,[argument]): 在此之前先区分一下:pri ...
- stderr 和stdout
今天又查了一下fprintf,其中对第一个参数stderr特别感兴趣. int fprintf(FILE *stream,char *format,[argument]): 在此之前先区分一下:pri ...
- stderr和stdout详细解说(转)
今天又查了一下fprintf,其中对第一个参数stderr特别感兴趣. int fprintf(FILE *stream,char *format,[argument]): 在此之前先区分一下:pri ...
随机推荐
- Ivy入门笔记
安装过程 命令行安装 下载和安装JDK5.Eclipse3.5.Ant 1.8.Ivy 2.2: 安装JDK:成功标志:在命令行下运行java命令,得到java命令行帮助: 安装Ant:解压Ant,在 ...
- Greenplum数仓监控解决方案(开源版本)
Greenplum监控解决方案 基于Prometheus+Grafana+greenplum_exporter+node_exporter实现 关联图 一.基本概念 1.Prometheus Pr ...
- 熬夜肝了一份 C++/Linux 开发学习路线
大家好,我是帅地. 之前写过几篇学习路线的文章 前端开发学习路线 Java 后端开发学习路线 一般开发岗主流的就是 Java 后台开发,前端开发以及 C++ 后台开发,现在 Go 开发也是越来越多了, ...
- Linux 文件、目录与磁盘格式
文件属性 连接数 文件持有者 文件所属群组 文件容量 文件最后修改时间 文件名(就那个..) 第一栏其中文件属性有10,第一个属性代表这个文件是目录.文件或链接文件: [d]目录 [-]文 ...
- awk-02-内置变量
内置变量 示例 1 FS和OFS 2 RS和ORS 3 NF是字段个数 4 NR和FNR NR 统计记录编号,每处理一行记录,编号就会+1,FNR 不同的是在统计第二个文件时会重新计数 NR和FNR区 ...
- Java Swing 空布局
Swing 空布局 试了盒布局,说实话不太会用,很多地方都没法更加的细节,又翻了翻资料,知道了还有一个空布局,一看,真不错,很适合我这种菜鸡 用坐标就可以完成界面的布局,不错 话不多说,直接代码 pa ...
- nohup 启动命令
start.sh #!/bin/bash nohup $PWD/node_exporter > /dev/null 2>&1 &
- 值得收藏 | 深度剖析 TensorCore 卷积算子实现原理
作者:章晓 | 旷视 MegEngine 架构师 一.前言 2020 年 5 月 Nvidia 发布了新一代的 GPU 架构安培(Ampere).其中和深度学习关系最密切的莫过于性能强劲的第三代的 T ...
- 安全工具推荐之w13scan篇
先上链接:https://github.com/w-digital-scanner/w13scan 这是一款漏洞发现工具,支持三大主流平台:windows.Linux.Mac 又一款完全免费开源的工具 ...
- ad 差分布线 等长布线
差分要素: 1.原理图差分对名字后缀必须是 _n _p 2.规则改动 定义差分线宽和间距