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 ");
}
原文地址:https://www.cnblogs.com/jisuanjizhishizatan/p/15230688.html
- Go 语言实现 MapReduce 框架
- Performance Schema使用简介(一)
- golang 垃圾回收 gc
- Go语言服务器开发之简易TCP客户端与服务端实现方法
- 移动搜索SEO分享:PHP自动生成百度开放适配及360移动适配专用的Sitemap文件
- 分享两种外链跳转方法,可避免权重流失。
- go语言十大排序算法总结
- 网站安全检测提示“页面异常导致本地路径泄漏”的解决办法
- Go语言归并排序算法实现
- 超強统计插件:My Visitors在知更鸟主题下的修改教程
- 让知更鸟主题的分类图标支持二级分类
- nwui —— 又一个go语言图形界面解决方案
- 分享博客统计中的动态运行天数代码
- GO语言标准错误处理机制error用法实例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法