关闭

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

标签: Linux
150人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:577次
    • 积分:62
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档