文章目录
一、三个标准流:stdin、stdout、stderr
标准输出流(stdout)
对应的文件表示符为:1
对于为什么打印一行字符串为什么会默认打印倒终端中,因为操作系统把标准输出流定向到了终端环境中。
程序可以使用标准输出函数(如
printf
、puts
等)将数据输出到stdout
,从而在终端上显示结果。
标准输入流(stdin)
对应的文件表示符为:0
默认在终端环境中进行读取数据。
用户可以通过键盘向程序提供输入,该输入会被发送到
stdin
中。程序可以使用标准输入函数(如scanf
、fgets
等)从stdin
中读取数据。
标准错误输出流(stderr)
对应的文件表示符:2
默认输出定向是终端环境中。
程序可以使用标准错误输出函数(如
fprintf(stderr, ...)
将错误信息输出到stderr
,从而在终端上显示错误。
三个流的缓冲区
代码演示:
- 对于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;
}
代码执行结果:
- 对于缓冲区的认识
#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