美文网首页Android开发经验谈Android技术知识
HeadFirst笔记系列——第三章 以文件作为输入输出

HeadFirst笔记系列——第三章 以文件作为输入输出

作者: 安新小子 | 来源:发表于2017-12-04 14:17 被阅读40次

这一章主要讲解了从终端的输入输出变成读取文本和写入文本。

我们写的程序所有的输入和输出都是显示到屏幕中的,键盘接收标准输入,屏幕接收标准输出,但是这样在实际应用中很不方便,需要向java中的流一样,把输入和输出都换成文本。

标准输入、输出和标准错误

标准输入:标准输入是输入的一个中介。系统会将键盘的输入发送到标准输入,系统会从标准输入读取数据。
标准输出:输出的中介。系统从标准输出中读数据,来显示的显示器上。
标准错误:类似标准输出,只是把程序中出现的错误单独摘出来。

scanf()printf()这两个函数不管数据从哪里来也不管数据要到哪里去,他们只管从标准输入种读取数据,然后向标准输出写数据有了标准输入和输出这样的中介,我们才可以从显示器以外的地方写数据。

对于scanf 和 printf 这两个函数也可以变种:


image.png

如图:一般使用的时候 使用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函数的参数来输入到程序中。具体用法,后面还会涉及到。

相关文章

网友评论

    本文标题:HeadFirst笔记系列——第三章 以文件作为输入输出

    本文链接:https://www.haomeiwen.com/subject/vhqxixtx.html