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
把两个程序连成一体

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

1、输入输出错误流概述: 比如这段程序: #include int main() {       printf("hello world!");        int a;        scanf...
  • SweetBullet
  • SweetBullet
  • 2015年11月18日 16:16
  • 310

Linux 输出流重定向缓冲设置

问题描述我写了一个Linux程序,程序很简单,源码如下:#include #include int main() { for(int i = 0; i < 10;i++) ...
  • frank_liuxing
  • frank_liuxing
  • 2017年01月04日 12:36
  • 2254

C/C++,Java 重定向输入输出流至文件

在我们做Online Judge的时候,OJ基本上都是用标准输入输出。但如果每次调试的时候也都是从控制台输入数据,那就太浪费时间了。 我们可以重定向标准输入,调试的时候从文件读数据,提交的时候从标准...
  • mason_mow
  • mason_mow
  • 2014年04月05日 13:44
  • 1658

Linux学习——数据流重定向与管道

一、数据流重定向 上图包含3种数据流: 1、标准输入流(stdin):代码为0,符号为; 3、标准错误流(stderr):代码为2,符号为2>或2>>。 将数据从指定的流输入或输出,就称为数据...
  • Jeff_Yellow
  • Jeff_Yellow
  • 2016年06月04日 17:13
  • 526

管道流

PipedInputStream和PipedOutputStream   管道:用来把一个程序的输出链接到另外一个程序    管道输入流作为一个通信管道的接收端,管道输出流作为一个通信管道的输...
  • qq_15150353
  • qq_15150353
  • 2016年10月01日 10:36
  • 292

linux管道pipe详解

管道 管道的概念: 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质: 1. 其本质是一个伪文件(实为内核缓冲区) 2. 由两...
  • oguro
  • oguro
  • 2016年12月23日 17:16
  • 19102

关于标准输出重定向到 管道的使用

void Call() { SECURITY_ATTRIBUTES sa;//创建一个安全属性的变量 HANDLE hRead,hWrite; //管道的读写句柄声明 sa.nLength =...
  • thanklife
  • thanklife
  • 2017年03月20日 10:07
  • 390

linux下cat、管道|、重定向命令详解

一:cat主要有三大功能: 1.查看整个文件。$ cat filename 2.从键盘创建一个文件。$ cat > filename  ,注意>>是追加    只能创建新文件,不能编辑已有文件....
  • zhousenshan
  • zhousenshan
  • 2016年08月01日 11:12
  • 1947

Linux操作系统应用输入输出和管道

  • 2011年05月27日 00:16
  • 63KB
  • 下载

Linux进程间通信:管道(把管道用作标准输入和标准输出)

#include int dup(int file_descriptor); int dup2(int file_descriptor_one , int file_descriptor_two); ...
  • querdaizhi
  • querdaizhi
  • 2012年04月24日 16:30
  • 4065
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下输入输出流错误流 & 重定向 & 管道
举报原因:
原因补充:

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