美文网首页
C++文件流:夹住一个小朋友咯

C++文件流:夹住一个小朋友咯

作者: 勾莲桑 | 来源:发表于2018-05-25 00:13 被阅读0次

    兴致勃勃的时候可以写一大堆,但现在不是。

    所以只简单说一下。

    建立一个文件流对象,相当于造了一个“夹子”。

    夹子是可以DIY的。对应于不同的打开方式。

    打开文件,就相当于用这个“夹子”夹住一个小朋友…奥呸,夹住一个文件。

    比如像这样:

    ——————————————————

    iostream fin(“D:\\a.txt”,ios::in);

    ——————————————————

    那么文件流类的成员函数又怎么解释呢?

    可以这样想象,夹子的另一头还有一个小管子,可以用这个小管子连接到内存。

    到此暂停一下,刚才讲了:夹子,夹子夹的文件,夹子背面的管子,内存。

    而夹子上夹的文件可以代表外存,而管子又可以连接内存,所以:

    文件操作就是内存与外存之间的数据交换。

    那么夹子上的管子具体指什么呢?

    就是fin.get(),fout.put()这样的函数。

    举个例子吧,看下面一段代码:

    ———————————————————

    char temp;

    ifstream fin(argv[1]);

    ofstream fout(argv[2]);

    fin.get(temp);

    fout.put(temp);

    ———————————————————

    有了先前的想象,这段代码就可以这样分析:

    首先做两个夹子出来,分别夹住两个小朋友(与外存建立的联系)

    其中,夹子fin能够从小朋友身体里抽东西出来(输入流:不妨说是成数据从文件“输入”到夹子上)

    而夹子fout能够往小朋友身体里注入东西(输出流:数据从夹子“输出”到文件上)

    或许“输入输出”这俩货会被经常弄混。

    当然夹子只是个中介,它一端已经夹住了小朋友。那么夹子的另一端呢?

    夹子的另一端都有管子,显然这两个管子(get( ) & put( ) )都接在了 temp 这个变量上。

    而变量是在哪里的?变量是程序运行时在内存里产生的。

    所以有了这个管子,就能够实现夹子与内存之间的联系。

    也就是说,夹子一端夹住了小朋友,另一端的管子连在了内存上对吧。

    这样的话,代码运行的过程就很有趣了:

    fin.get(temp);

    fin这个夹子从它夹住的小朋友身体里面抽取了一个字符,然后通过管子送给了变量temp的身上。(从外存到内存)

    fout.put(temp);

    fout这个夹子,它背后插的管子把变量temp给吸出来了,然后又注射到它夹住的小朋友身体里。(从内存到外存)

    至此,上面的代码执行完了。实现了第一个文件里面的第一个字符移到了第二个文件里面。

    当然,还没结束。

    因为夹子仍然还夹着文件上,每个小朋友老是被夹着都不会舒服的吧?

    所以我们要把它放开:

    —————————————————

    fin.close();

    fout.close();

    —————————————————

    这个时候,不仅小朋友被放开了很开心,夹子也很开心。

    因为夹子又可以去夹别的小朋友啦!

    例如:

    —————————————————

    fin.open(argv[3]);

    —————————————————

    这时候想想实验的文件合并的那题,是不是只需要用两个夹子呢?

    第一次写的时候我也用了三个夹子。哎呀不重要不重要。

    (话说,会不会有人不知道argv是啥子嘞,百度百度~)

    有了这种理解作为基础,再去看文件操作作业里面第四题,把Student信息输入到文件里,再读出来打印到屏幕上。和上面的小朋友操作有什么不一样的呢?

    其实就是,夹子背面插的管子,不是连接上了temp那样的一个字符型变量里,而是连上了一大坨的什么东西上。怎么解释?

    内存吧,你把它看成一个个小箱子。

    现在我假设有那么一种小箱子,它正好可以盛下那一坨Student什么东西,然后管子再去连那种那么大的箱子。

    连上之后,再用管子从箱子里吸东西到小朋友身体里的时候,正好把一箱子的东西全吸完。或者反方向,从小朋友身体里通过管子往箱子里塞东西的时候,正好能塞满一箱子。

    有这样的箱子,Student类的对象就是这样一种箱子。问题是,有那么厉害的管子吗?

    废话,没有我还说吗?

    我们见过的管子,是get( ) 和 put( ),他俩有点细,一次只能通过一个字符。

    而read( )和 write( )这俩管子,一次不仅仅能吸一个字符,重点是,你可以让它想怎么变就怎么变。想一次吸多少东西吸多少东西。

    问题是,这个管子怎么用?

    简单,就俩件事:

    1.告诉它你要把它放在哪里吸

    2.告诉它你要让它吸多少出来

    在参数上面,显然,第一个就是地址,第二个就是长度,也就是占内存大小。

    学会用这个管子之后,我们来实际操作一下。

    就拿那个小朋友和箱子举例子。

    算了我好累了不写了,自行脑补,一抽一箱子,简直不讲道理。

    总之吧,文件操作就是:

    夹子夹住了小朋友

    塞了一根管子

    连在箱子上

    而且:

    夹子可以有很多种

    小朋友也可以有很多个

    管子也有好几种

    箱子想造什么样造什么样

    咳咳~

    文件(外存),夹子(流对象),管子(流类成员函数),变量(内存)。

    文件流也就这样嘛~

    编程语言没多难,重点是思考。

    分享给同学们。

    相关文章

      网友评论

          本文标题:C++文件流:夹住一个小朋友咯

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