转载请保留原作者。

一.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相关的更多相关文章

  1. (转)Windows管道(Pipe)重定向stdout,stderr,stdin

    参考: http://qiusuoge.com/11496.html http://www.cnblogs.com/BoyXiao/archive/2011/01/01/1923828.html st ...

  2. WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)

    WorkerMan中work.php中 resetStd 方法中代码如下 public static function resetStd() { if (!static::$daemonize || ...

  3. stdin stdout stderr 标准I/O流

    Unix中一切皆文件,磁盘等设备在操作系统来看都是文件. 对文件进行操作时,需要打开这个文件,并获得文件描述符(file descriptor, fd) 而每个进程生来就有三个文件描述符绑定在它身上, ...

  4. Linux Shell 文件描述符 及 stdin stdout stderr 重定向

    Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...

  5. shell基础知识之 stdin,stdout,stderr和文件描述符

    stdin,stdout,stderr stdin=0 stdout=1 stderr=2 使用tee来传递内容,把stdout 作为stdin 传到下个命令 root@172-18-21-195:/ ...

  6. stdin stdout stderr - 标准 I/O 流

    Fd #include <stdio.h> Fd extern FILE *stdin; Fd extern FILE *stdout; Fd extern FILE *stderr; D ...

  7. 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   ...

  8. stderr和stdout详细解说

    今天又查了一下fprintf,其中对第一个参数stderr特别感兴趣. int fprintf(FILE *stream,char *format,[argument]): 在此之前先区分一下:pri ...

  9. stderr 和stdout

    今天又查了一下fprintf,其中对第一个参数stderr特别感兴趣. int fprintf(FILE *stream,char *format,[argument]): 在此之前先区分一下:pri ...

  10. stderr和stdout详细解说(转)

    今天又查了一下fprintf,其中对第一个参数stderr特别感兴趣. int fprintf(FILE *stream,char *format,[argument]): 在此之前先区分一下:pri ...

随机推荐

  1. Notes about multiboot usb creator

    U盘上的多系统启动工具,Windows上YUMI比较好,Ubuntu上MultiSystem用法复杂,unetbootin是另外一款,需要安装p7zip(apt-get install p7zip-f ...

  2. Rip CD on Ubuntu

    用Mint自带的banshee可以把CD转换为ogg文件,[Media -> Import Media],然后选择Audio CD,但只能转换为ogg格式,好像不能自动获取ID3标签:比较好的方 ...

  3. Apache网页优化与安全

    目录 一.Apache网页优化 1.1.概述 1.2.gzip介绍 1.3.Apache的压缩模块 二.网页压缩实验 2.1.检查是否安装mod_deflate模块 2.2.重新编译安装Apache添 ...

  4. Java基础技术基础面试【笔记】

    Java基础技术基础面试[笔记] String.StringBuilder以及StringBuffer三者之间的区别? 三者的区别可以从可变性,线程安全性,性能这三个部分进行说明 可变性 从可变性来说 ...

  5. 使用Squid部署代理缓存服务(标准正向、透明正反向代理)

    正向代理让用户可以通过Squid服务程序获取网站页面等数据,具体工作形式又分为标准代理模式与透明代理模式.标准正向代理模式: 将网站的数据缓存在服务器本地,提高数据资源被再次访问时的效率,但用户必需在 ...

  6. 解决uni-file-picker组件在ios点击失效的问题

    从组件源码里找到choose-and-upload-file.js文件,查找chooseAndUploadFile方法,在方法里添加下面代码,保存即可解决. opts.sourceType = ['a ...

  7. spring-boot 2.5.4,nacos 作为配置、服务发现中心,Cloud Native Buildpacks 打包镜像,GitLab CI/CD

    spring-boot 2.5.4,nacos 作为配置.服务发现中心,Cloud Native Buildpacks 打包镜像,GitLab CI/CD 本文主要介绍 Java 通过 Cloud N ...

  8. SQL 练习13

    查询没学过"张三"老师讲授的任一门课程的学生姓名 SELECT * from Student WHERE SId not in ( SELECT SC.SId from Teach ...

  9. 寻找写代码感觉(三)之使用 Spring Boot 编写接口

    一.前言 项目配置完之后,接着就是写接口了,那咱们就开始吧. 二.项目配置补充知识点 上篇文章写的是关于项目属性配置的一些知识,这里针对上次遗忘内容进行补充如下: 2.1.获取配置文件的值 在appl ...

  10. 【mysql】explain性能分析

    1. explain的概念 使用EXPLAIN 关键字可以模拟优化器执行SQL 查询语句,从而知道MySQL 是如何处理你的SQL 语句的.分析你的查询语句或是表结构的性能瓶颈. 用法: Explai ...