这一章主要讲解了从终端的输入输出变成读取文本和写入文本。
我们写的程序所有的输入和输出都是显示到屏幕中的,键盘接收标准输入,屏幕接收标准输出,但是这样在实际应用中很不方便,需要向java中的流一样,把输入和输出都换成文本。
标准输入、输出和标准错误
标准输入:标准输入是输入的一个中介。系统会将键盘的输入发送到标准输入,系统会从标准输入读取数据。
标准输出:输出的中介。系统从标准输出中读数据,来显示的显示器上。
标准错误:类似标准输出,只是把程序中出现的错误单独摘出来。
scanf()
和printf()
这两个函数不管数据从哪里来也不管数据要到哪里去,他们只管从标准输入种读取数据,然后向标准输出写数据有了标准输入和输出这样的中介,我们才可以从显示器以外的地方写数据。
对于scanf 和 printf 这两个函数也可以变种:

如图:一般使用的时候 使用fscanf,fprintf 接收一个标准输入或者输出或者标准错误流
重定向
重定向: 在运行程序的时候,将输入变成文本,将输出也写到文本中
通过 <
操作符从文本中读取数据 使用 >
将数据写到文本中,写出数据也可以使用 >>
,但是读取数据只能中 <
./geo2json < input.txt > output.json //表示从input.txt中读取数据,结果输出到 output.txt中
管道
管道:一个程序需要将另一个程序的输出当做输入,这时就要用到管道来连接,使用符号
|
(./bermuda | ./geo2json) < input.txt > output.json
上面两个程序 bermuda 和 geo2json 使用管道来连接, bermuda 的输出作为geo2json 的输入,然后通过重定向来完成对文本的读取和写入。
注意:当管道和重定向来一起使用的时候,重定向的输入只当做第一个管道程序的输入,输出为最后一个管道程序的输出。对于上面的例子,input.txt 文件中的数据作为 bermuda 程序的输入,bermuda 程序的输入由于管道的连接作为了geo2json 程序的输入,然后geo2json 程序的输入又重定向到了 output.json 文件中。
创建数据流
上面的操作只能使用系统提供的三条数据流:标准输入、标准输出、标准错误。有时我们需要建立自己的数据流,比如输入的数据中根据自己的要求分成三份来输出,这时就要建立自己的数据流。使用fopen() 来创建新数据流。
FILE *in_file = fopen("input.txt", "r"); //创建一条数据流,从文件中读取数据
...
...
fclose(in_file); //在使用完之后要记得关闭。
小例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char line[80];
FILE *in = fopen("spooky.csv", “r”); //创建读取的数据流
FILE *file1 = fopen("ufos.csv", “w”);//创建写入的数据流
FILE *file2 = fopen("disappearances.csv", “w”);
FILE *file3 = fopen("others.csv", “w”);
while ( fscanf(in, "%79[^\n]\n", line) == 1) { //开始读
if (strstr(line, "UFO")) //写入不同文件中的条件
fprintf(file1, "%s\n", line);
else if (strstr(line, "Disappearance"))
fprintf(file2, "%s\n", line);
else
fprintf(file3, "%s\n", line);
}
fclose(file1); //关闭数据流
fclose(file2);
fclose(file3);
return 0;
}
关于C语言中的main函数
到现在为止,学到的都是空参的main函数,main函数也有有参数的:
int main(int argc , char* argv[])
参一:表示接收的字符数组的长度
参二:表示接收接收的字符数组
当我们在运行程序的时候,后面可以加上字符串,当做main函数的参数来输入到程序中。具体用法,后面还会涉及到。
网友评论