转载请保留原作者。

一.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 ");
}

最新文章

  1. 在此记录一下SharpGL最初创建的程序
  2. 【poj3261】 Milk Patterns
  3. HTML5学习总结-01 开发环境和历史
  4. httpwebrequest 请求压缩,接受压缩的字符流请求
  5. 通知(NSNotificationCenter)
  6. C#&amp;java重学笔记(函数)
  7. javascript设计模式1
  8. 简单介绍一下ODI的几个基本概念
  9. Maven手动增加依赖jar到本地Maven仓库中
  10. Spring框架学习1
  11. OpenStack Horizon创建虚拟机时增加虚拟机OS用户
  12. Java-NIO(九):管道 (Pipe)
  13. MySQL 8.0常见问题
  14. 20165313 《网络对抗技术》 Kali安装
  15. LuoGu P1083 借教室
  16. WebService(基于AXIS的WebService编程)
  17. Python字符串拼接的6种方法
  18. Unable to cast COM object of type &#39;Shell32.ShellClass&#39; to interface type &#39;Shell32.IShellDispatch6&#39;.
  19. 【Java】-NO.16.EBook.4.Java.1.003-【疯狂Java讲义第3版 李刚】- oop
  20. 如何用Qt自动拷贝exe依赖的dll

热门文章

  1. bat脚本中%~dp0含义解释
  2. CleanArchitecture Application代码生成插件-让程序员告别CURD Ctrl+C Ctrl+V
  3. SQL注入:基本查询原理
  4. S3C2440—11.und异常
  5. Linux部署达梦数据库(完全版)
  6. Freemarker基本语法
  7. 项目报错:Invalid bound statement (not found):
  8. 依赖注入@Autowired@Primary@Quelifier使用
  9. JDBC基础篇(MYSQL)——使用CallabeStatement调用存储过程
  10. Flink与Strom两个框架的对比分析