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 sum, n;
scanf("%d,%d", &sum, &n);
float v=sum/n;
printf("%f", v);
return 0;
}
{
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);
return 0;
}