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

main.c文件如下

#include <stdio.h>

int main()
{
    printf("input the int value i:\n");//标准输出流,输出到显示器
    int i, j;
    scanf("%d",&i);//标准输入流,由键盘输入
    printf("input the int value j:\n");
    scanf("%d", &j);
    printf("i + j = %d\n", i + j);

    return 0;
}
  1. 输出流重定向

在Linux系统中,
gcc main.c后生成a.out

执行 ./a.out 后,分别输入i , j的值,结果如下:
这里写图片描述

现在,把执行./a.out稍微改造一下

./a.out 1>> a.txt或把1默认不写./a.out >> a.txt 都一样

把标准输出流重定向到a.txt,也就是说,以前的输出流默认情况下是我的终端(显示器),重定向以后就不再输出到终端了,它会把我们的内容输出到a.txt文件里去

这个就是我们的重定向,标准的输入流0、标准的输出流是1,不写就是默认。

执行之后:
这里写图片描述
显示器上什么都没显示。这时我们cat查看a.txt文件

cat a.txt结果如下:
这里写图片描述

也就是说,我们原本应该输出到终端上的输出到了a.txt文件上

如果我们再执行一次
./a.out >> a.txt
执行之后:
这里写图片描述
显示器上仍然是什么都没有,现在我们cat查看一下a.txt

这里写图片描述
这个时候 a.txt 里面有两次执行的内容,把内容重定向到我们这个文件之外,它还不会覆盖我们这个文件原来的内容,说白了它是在我们原来文件的末尾再加上这个内容。

如果用单箭头>重定向到a.txt就是会每次把一个文件覆盖成最新的内容。覆盖模式

如果用双箭头>>就是把新内容堆加到文件的结尾。追加模式

2.输入流重定向

准备一个文件

vi input.txt 内容如下:
6
8
这里写图片描述
这个input.txt中就只保存了两个值。

再执行./a.out < input.txt

默认的输入流本来是键盘,重定向之后,以文件取代键盘,我们可以把程序需要的数据全都在input.txt中保存好。

执行结构如下:

这里写图片描述

输出到终端(屏幕)

3.错误流重定向

改造一下 main.c,之前并没有写错误流。

#include <stdio.h>

int main()
{
    printf("input the int value i:\n");//标准输出流,输出到显示器
    int i, j;
    scanf("%d",&i);//标准输入流,由键盘输入
    printf("input the int value j:\n");
    scanf("%d", &j);
    if(j != 0)
    {
        printf("%d / %d = %d\n", i, j, i / j);//用除法,j肯定不能为0,如果等于0,我们就应该显示出错。    
    }else 
    {
    fprintf(stderr,"j != 0\n");//标准错误流,输出一个""内的内容 
    return 1;//标准错误流有一个要求函数的返回值不能等于0
    }
    return 0;
}

gcc main.c

然后./a.out 结果如下:

这里写图片描述

echo $?
0 返回值是0说明程序正常运行,说明标准错误流是没有得到输出的。

下面换一个值试验
./a.out 执行程序如下:

这里写图片描述

echo $?
1 返回值是1 说明程序运行是错误的。

**我们把正确的结果和错误的结果分别导入。

./a.out 1>t.txt 2>f.txt

标准输出流的内容保存到t.txt文件

标准错误流的内容保存到f.txt文件

给 i赋值 4,j赋值0有如下结果:
这里写图片描述

input the int value i:

input the int value j:

这两句是默认输出到终端的,重定向到了t.txt文件中了(把标准输出流保存到了t.txt文件)

把标准错误流重定向到了 f.txt 中

错误流其实就一句话:j != 0

我们可以把标准的输入流、输出流和错误流来分别的导入导出

./a.out 1>t.txt 2>f.txt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值