详解C语言中的stdin,stdout,stderr

我们在写C程序时经常遇到printf(),fprintf(),perror(),这些东西到底有什么作用。说到这不得不提及stdin,stdout,stderr。想想,我们在用C去写文件时的操作,File *fp=fopen(),这个fp就是我们向系统申请的,相当于一通往文件的通道。

 

其实,stdin,stdout,stderr就是这个fp,不过他是随着计算机系统的开启默认打开的,其中0就是stdin,表示输入流,指从键盘输入,1代表stdout,2代表stderr,1,2默认是显示器。printf()其实就是向stdout中输出,等同于fprintf(stdout,“****”),perror()其实就是向stderr中输出,相当于fprintf(stderr,“***”),那到底stdout,和stderr有什么区别和作用呢?

 

我们在写程序时用printf()是为了我们能监控我们的程序运行状况,或者是说debug,如果我们的程序是一直运行,不停下来,我们不可能时刻盯着屏幕去看程序输出,这时我们就可以用文件重定向。将输出到一文件中,我们以后就可以看这文件就行。举个例子,test.c

[cpp] view plain copy 

1. <pre class="cpp" name="code">#include<stdio.h>  

2.   

3. int main()  

4. {  

5.      printf("stdout Helo World!!\n");   

6.   

7.      return 0;  

8. }  

编译过后,我们./test > test.txt(默认是将stdout里的内容重定向到文件中),这样就把test程序输出的内容输出到test.txt文件中。还有一种更明晰的写法./test  1>test.txt,这里的1就代表stdout。说到这你应该知道stderr该怎样处理了。再举个例子test.c:

[cpp] view plain copy 

1. #include<stdio.h>  

2.   

3. int main()  

4. {  

5.      printf("Stdout Helo World!!\n");  

6.      fprintf(stdout,"Stdout Hello World!!\n");  

7.      perror("Stderr Hello World!!\n");  

8.      fprintf(stderr,"Stderr Hello World!!\n");  

9.        

10.      return 0;  

11. }  

编译过后,./test,屏幕上是四条输出,如果./test > test.ext ,结果是屏幕上输出两条Stderr Hello World!!,Stdout Helo World!!在文件test.txt中,基于上面说的很容易理解现在的结果,于是我们可以随便处理我们想要的输出,例如:

 

./test 1>testout.txt 2>testerr.txt,我们将stdout输出到文件testout.txt中,将stderr输出到testerr.txt文件中;

./test 1>testout.txt ,将stdout输出到文件testout.txt 中,stderr输出到屏幕上;

./test 2>testerr.txt,将stderr输出到文件testerr.txt中,stdout输出到屏幕上;

./test > test.txt 2>&1,这是将stdout和stderr重定向到同一文件test.txt文件中。

 

如果我们不想看到输出内容,既不想在屏幕上看见,也不想重定向到文件中,别担心,万能的Linux有解决办法,./test > /dev/zero 2>&1,这样就看不到任何输出了。

 

Note:stderr,和stdout还有重要一点区别,stderr是没有缓冲的,它立即输出,而stdout默认是行缓冲,也就是它遇到‘\n’,才向外输出内容,如果你想stdout也实时输出内容,那就在输出语句后加上fflush(stdout),这样就能达到实时输出的效果。


转载于微信公众号 嵌入式ARM


  • 76
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在C语言,`stdin`、`stdout`和`stderr`是三个标准的I/O流。它们分别代表标准输入、标准输出和标准错误输出。 `stdin`是标准输入流,通常用于从用户或文件读取输入。例如,使用`scanf`函数从标准输入读取用户输入的数据。 `stdout`是标准输出流,通常用于向屏幕或文件输出结果。例如,使用`printf`函数向标准输出流输出字符串或数字。 `stderr`是标准错误输出流,通常用于向屏幕或文件输出程序错误和警告信息。例如,使用`fprintf`函数向标准错误输出流输出错误信息。 在程序,可以使用`stdin`、`stdout`和`stderr`来进行输入输出的操作。这些标准流在大多数操作系统都是默认开启的,因此无需显式地打开或关闭它们。 ### 回答2: C语言的标准库包含三个预定义的文件指针:stdinstdoutstderr。它们都是指向FILE结构体的指针。这三个文件指针分别表示输入流、输出流和错误流。 stdin:是标准输入流,通常关联键盘输入,它接受用户的输入数据,并传递给程序进行处理。当需要从stdin读入数据时,可以使用常用的输入函数scanf()和getchar()等。 stdout:是标准输出流,通常关联屏幕输出,它把程序的输出结果送到显示器上。当需要向stdout输出数据时,可以使用常用的输出函数printf()和putchar()等。 stderr:是标准错误流,通常关联屏幕输出,它用于向用户显示程序执行过程出现的错误和警告信息。当程序出现错误时,可以通过把错误发送到stderr,让用户能够更好地理解问题。 C语言,这三个文件指针都是预定义的,因此无需自己打开或关闭它们。在程序开始执行时,它们已经被定义为指向标准输入、标准输出和标准错误流。但是,我们还可以通过重定向的方式来改变它们的默认行为。通过使用重定向操作符(例如“<”和“>”),我们可以重定向为其他文件,这样我们就可以从文件读取输入,把输出重定向到文件,记录错误信息等等。 总之,在C语言使用这三个标准流非常方便和实用。无论是基本的输入输出还是处理错误,它们都是必不可少的。可以通过它们来进行交互式输入输出,记录用户输入,以及发现和解决程序的问题。 ### 回答3: C语言stdinstdoutstderr是三个标准的输入输出流。在C语言,这三个流都有其独特的用途和属性。 首先,stdin是标准输入流。简单来说,它是向程序输入数据的流。当程序使用scanf等函数从stdin读取数据时,就是从标准输入流读取数据。标准输入流通常被绑定到键盘上,也就是说,当程序从stdin读取数据时,需要用户输入数据才能进行下一步操作。 其次,stdout是标准输出流。在程序使用printf等函数输出数据时,是将数据输出到stdout。标准输出流通常被绑定到显示器上,也就是说,当程序将数据输出到stdout时,数据将在显示器上呈现出来。 最后,stderr是标准错误流。当程序运行出错时,通常会将错误信息输出到stderr。与stdout不同的是,stderr流不会被重定向到文件或其他设备上,而是始终输出到屏幕上,这样可以确保用户能够看到错误信息并尽快进行修复。 总之,C语言stdinstdoutstderr是非常重要的输入输出流,它们为程序的输入输出提供了标准的接口和便捷的操作方式,并在调试程序或排除错误时提供了有用的信息。因此,程序员应当深入了解它们的特性和用法,以便高效地进行开发和调试工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值