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

本文介绍了Linux下输入输出错误流的概念,包括stdin、stdout和stderr的默认设置。详细讲解了如何重定向输出流到文件,避免覆盖已有内容,并通过示例展示了输入流重定向。此外,还探讨了标准错误流的使用,以及如何通过管道连接命令,实现数据流的传递。最后,提供了一些实际的命令行示例,如错误流分离和管道命令的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值