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 ...
随机推荐
- noip38
T1 有个朴素的暴力,枚举每一个子矩形,复杂度 \(O(n^{2}m^{2})\),观察数据范围,n很小,考虑枚举行,对于 \(m\) 用 \(two\;pointers\) 来维护. 先预处理出每一 ...
- The requested PHP extension ext-http * is missing from your system. Install or enable PHP's http ex
composer.json 包含 "require": { "ext-http": "*" } 删掉 "ext-http&quo ...
- 如何快速排查发现redis的bigkey?4种方案一次性给到你!
本篇文章将以redis的bigkey为主题进行技术展开,通过从认识redis的高性能,bigkey的危害.存在原因.4种解决方案,到模拟实战演练的介绍方式,来跟大家一起认识.探讨和学习redis. 先 ...
- C#异步编程2
- 服务端负载监控-参考srs服务器源码
#include <map> #include <stdio.h> using namespace std; struct SrsMemoryObject { void* pt ...
- 深入浅出Mybatis系列(二)---Mybatis入门
一.Mybatis环境搭建及简单实例 1. 新建web项目, 添加依赖包:mybatis包.数据库驱动包(我使用的是mysql).日志包(我使用的是log4j), 由于我的是maven项目, 那么添加 ...
- offsetof宏---个人笔记
标准库里面提供的offsetof(t,m)宏,用来计算两个变量在内存中的地址偏移量 #include <stdio.h>//原型: #define offsetof(TYPE, MEMBE ...
- js对url进行编码和解码
编码 只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不经过编码直接用于 URL. 例如:搜索的中文关键字,复制网址之后再粘贴就会发现该URL已经被转码. 1. ...
- JDBC基础篇(MYSQL)——PreparedStatement执行DML、DQL等
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day03.prepare; import java.sql.Connection; import java.sql ...
- Gradient checking
所需文件:本地下载 Gradient Checking Welcome to the final assignment for this week! In this assignment you wi ...