【重学C语言】第六章:重学输入和输出

一、三个标准流:stdin、stdout、stderr

标准输出流(stdout)

对应的文件表示符为:1

对于为什么打印一行字符串为什么会默认打印倒终端中,因为操作系统把标准输出流定向到了终端环境中。

程序可以使用标准输出函数(如 printfputs 等)将数据输出到 stdout,从而在终端上显示结果。

在这里插入图片描述

标准输入流(stdin)

对应的文件表示符为:0

默认在终端环境中进行读取数据。

用户可以通过键盘向程序提供输入,该输入会被发送到stdin中。程序可以使用标准输入函数(如scanffgets等)从stdin中读取数据。

在这里插入图片描述

标准错误输出流(stderr)

对应的文件表示符:2

默认输出定向是终端环境中。

程序可以使用标准错误输出函数(如fprintf(stderr, ...)将错误信息输出到stderr,从而在终端上显示错误。

在这里插入图片描述

三个流的缓冲区

在这里插入图片描述

代码演示:

  1. 对于3种流的最基本的使用:
#include<stdio.h>

int main() {
   
   
    //利用标准输出流输出
    printf("hello world\n");// stdout
    int n;
    //利用标准输入流进行读取数据
    scanf("%d", &n);// stdin
    printf("n = %d\n", n);
    //利用了标准错误输出流进行输出数据
    perror("out of range\n");//stderr
    return 0;
}

代码执行结果

在这里插入图片描述

  1. 对于缓冲区的认识
#include<stdio.h>

int main() {
   
   
    printf("alskaskldjaslkdjlaskld123");
    *((int *)(0)) = 5;
    return 0;
}

执行结果:

在这里插入图片描述

可以看到终端上没有打印printf函数内的内容,但不能说明printf函数那句代码是有错误的,只是内容还在输出缓冲区里面,还没有进行输出,程序就执行崩溃了。

继续往下看:

在printf函数内容种最后加上一个换行符(\n),看输出结果:

在这里插入图片描述

因为遇到换行符 \n 时会触发缓冲区的刷新,即将缓冲区中的数据输出到终端中。

这就体现了缓存区的作用。

另一种方法就是使用fflush进行对内容输出:

#include<stdio.h>

int main() {
   
   
    printf("alskaskldjaslkdjlaskld123\n");
    //stdout在操作系统种也是文件
    //利用fflush函数进行对stdout文件进行冲刷,也就是刷新他的缓冲区
    //然后内容就会打印到终端上
    fflush(stdout);
    *((int *)(0)) = 5;
    return 0;
}

执行结果:

在这里插入图片描述

窥探标准流fscanf和fprintf

在这里插入图片描述

#include<stdio.h>

int main() {
   
   
    //向标准输出流种输出hello world
    fprintf(stdout, "hello world\n");
    //向标准输入流种读入数据
    int n;
    fscanf(stdin, "%d", &n);
    //向标准错误输出流种打印n的值
    fprintf(stderr, "n = %d\n", n);
    return 0;
}

执行结果:

在这里插入图片描述

标准流的重定向

在这里插入图片描述

如何讲输出内容重定向输出到一个文件中?

两种方式

第一种方法

是用freopen函数进行重定向

在这里插入图片描述

如何使用:

#include<stdio.h>

int main() {
   
   
    //参数一需要输出的新文件名
    //参数二以打开文件的什么模式
    //参数三需要重新定向的文件指针
    freopen("output.txt", "w", stdout); //r代表读文件,w代表写文件
    freopen("input.txt", "r", stdin); //r代表读文件,w代表写文件
    printf("hello freopen yes\n");
    char s[1000] = {
   
   0};
    //当读入到文件结尾时,循环结束
    while (scanf("%[^\n]", s) != EOF) {
   
   
        //getchar()从标准输入流中读取一个字符
        //这里为什么要使用到getchar()
        //因为在使用scanf时
        //里面的字符匹配集是非\n就读取
        //那么在最后遇到\n的时候结束读取
        //最后输入流中会存留一个\n
        //然后scanf一直不读取
        //最后造成了while死循环
        //所以在这需要使用一个getchar()来对\n进行处理掉
        getchar();
 
        printf("%s | hello world\n", s);
    }
    return 0;
}

input.txt(这个文件是需要自己创建,并在里面写东西的):

ni hao
优快云 
GCC
Good

执行前,只有input.txt和源代码文件:

在这里插入图片描述

执行后(a.out是源代码编译后的可执行程序):

在这里插入图片描述

发现output.txt在执行程序后被创建出来,再看看output.txt中的内容:

和程序设计还有想法是一样的结果。

在这里插入图片描述

第二种方法:

在命令中执行重定向(只能在linux环境下可以使用)

需要用到的源代码

#include<stdio.h>

int main() {
   
   
    char s[1000] = {
   
   0};
    while (scanf("%[^\n]", s) != EOF) {
   
   
        getchar();
        printf("%s | hello world\n", s);
    }
}

然后进行对源文件的编译:

在这里插入图片描述

在进行对文件的标准输出流重定向到output.txt文件中,因为是输出所以需要指向目标文件

在这里插入图片描述

在输入的最后,需要手动打入一个文件结束,ctrl+D,表示输入结束。

在这里插入图片描述

然后打开output.txt文件查看

在这里插入图片描述

在试一下对执行文件的标准输入流重定向,因为是需要读入所以需要目标文件是可执行程序,需要指向自己

在这里插入图片描述

在这里插入图片描述

用命令行重定向标准错误输出流

#include<stdio.h>

int main() {
   
   
    char s[1000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值