Linux下输入输出流错误流 & 重定向 & 管道

原创 2015年11月18日 16:16:25

1、输入输出错误流概述:

比如这段程序:

#include <stdio.h>

int main()

{

      printf("hello world!");

       int a;

       scanf("%d",&a);

       printf("input value is :%d\n",a);

       return 0;

}

启动一个进程,把stdio包含进来,默认创建stdin stdout stderr三个文件。Linux把任何程序(包括键盘、摄像头)都当成文件

都是从文件读或者写信息

stdin:默认是键盘

stdout:默认是显示器,可以变成打印机等

#include <stdio.h>

int main()

{

    //printf("please input the value a :\n");stdout是显示器现在

    fprintf(stdout,"please input the value a :\n");                //底层是这样的

    int a;

    //stdin是键盘

     fsacnf(stdin,"%d",&a);

     if(a<0){

          fprintf(stderr,"the value must > 0");

           return 1;

     }

     return 0;

}

执行的时候如果输入是-1,那么将会输出 :the value must > 0


2、输出流重定向:

a.c中实现输入两个数,求和。现在把它编译

#include <stdio.h>

int main()

{
       printf("input the int value i:\n");

       int i,j;

       sacnf("%d",&i);

        printf("input the int value j:\n");

        scanf("%d",&j);

       printf("%d+%d=%d\n",i,j,i+j);

        return 0;

}

然后运行:     ./a.out 1>>a.txt

这样就把a.out的结果打印到a.txt,而不是打印到终端。

如果再运行一次 ./a.out >>a.txt ,不会覆盖,而是在末尾加上新的纪录(1加与不加效果一样)

所以会出现两条记录,如果想看最新一条记录,那么输入一个<: ./a.out  > a.txt


比如查看ls,也可以重定向。

ls /etc >> etc.txt    就可以把目录下的文件输入到txt中。


3、输入流重定向:

本来默认输入流为键盘。

先vi input.txt  ,写两个数据:6  8

./a.out < input .txt  从input.txt中读取程序的参数,结果输出14


4、标准错误流:

#include <stdio.h>

int main()

{
       printf("input the int value i:\n");

       int i,j;

       sacnf("%d",&i);

        printf("input the int value j:\n");

        scanf("%d",&j);

        if(0!=j){

               printf("%d/%d=%d\n",i,j,i/j);

        }else{

                fprintf(stderr,"j != 0\n");                //标准错误流    

                return  1;    

        }

        return 0;

}


PS:

运行  ./a.out 1> t.txt 2>f.txt                   表示正确的输出流到t.txt,错误流到f.txt。

标准输入流    ->      键盘输入

标准输出流    ->      终端输出

标准错误流    ->      错误输出



5、管道:

即把前一个命令的输出流作为后一个命令的输入流

ls  /etc/  | grep ab    

 “|”是管道命令,表示将ls的输出结果不直接输出到终端,而是作为grep的输入流

整条命令的意思是找到etc目录下包含“ab”的文件

再比如

ps    可查看进程

ps -e | grep ssh   看进程中有没有包含ssh的进程



6、管道的例子:

第一个程序是求平均数:avg.c

int main()
{
 int sum, n; 
 scanf("%d,%d", &sum, &n);
 float v=sum/n;
 printf("%f", v);

 system("pause");
 return 0;
}


第二个是统计数据求和已经个数:input.c
int main()
{
 int flag = 1;
 int count = 0;
 int sum = 0;
 int i;
 while (flag) {
  scanf("%d", &i);
  if (0 == i) break;
  count++;
  sum += i;
 }
 printf("%d,%d", sum, count);

 system("pause");
 return 0;
}

最后管道命令:
./input.out  |  ./avg.out
把两个程序连成一体

C# 程序通过匿名管道控制exe控制台程序 输入输出流重定向 WPF向控制台程序传递参数出现“句柄无效”问题

在做WPF桌面端软件的时候需要调用别人的exe控制台程序,单独运行exe需要手动输入参数,并进行一些参数选择,要控制exe程序就需要用到匿名管道。 主要步骤: 1.启动控制台exe的Pro...

[Linux C语言](学习笔记)标准输入流输出流以及错误流的重定向机制(1)

main.c文件如下#include int main() { printf("input the int value i:\n");//标准输出流,输出到显示器 int i, j; ...

8Linux输入输出重定向以及管道.ppt

  • 2012年11月26日 21:50
  • 249KB
  • 下载

freopen()——重定向标准输入输出流

freopen()——重定向标准输入输出流   头文件:stdio.h 函数原型:FILE * freopen(const char *filename , const char *type...

【C/C++学院】0826-文件重定向/键盘输入流/屏幕输出流/字符串输入输出/文件读写简单操作/字符文件读写二进制与文本差别/get与getline挖掘数据/二进制与文本差别/随机位置/多线程初级

文件重定向 [java] view plaincopy #include   using namespace std;  ...

08_I/O输入输出流、文件重定向、格式控制、标准输入输出、 串流类、 文件操作、多线程

目录 一IO输入输出流 二文件重定向 三标准输入流 四标准输出流 五格式控制 六串流类 七文件操作fstream【目录】一、 I/O输入输出流 3 1、 流类库ios和streambuf: 3...

linux基本操作学习04:管理输入输出 (重定向、管道符)、vim、gedit

#unit4##1.管理输入输出#在linux系统中,正确输出的编号为1,错误输出编号为2在系统中用普通用户执行 “student” find /etc -name passwd 因为stude...

linux输入输出重定向及管道

linux输入输出重定向及管道

Linux操作之输入输出重定向和管道

       Unix下使用标准输入stdin和标准输出stdout,来表示每个命令的输入和输出,还使用一个标准错误输出stderr用于输出错误信息。这三个标准输入输出系统缺省与控制终端设备相联系在一...
  • zcczcw
  • zcczcw
  • 2011年03月01日 20:24
  • 454
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下输入输出流错误流 & 重定向 & 管道
举报原因:
原因补充:

(最多只允许输入30个字)