C++的标准输出和读写文件

来源:互联网 发布:淘宝卖家售假被扣48分 编辑:程序博客网 时间:2024/06/10 01:15

         作为第一篇博客,本想写点对深度学习的理解, 但是基于码农的考虑,还是先写“hello word”的一些思考吧。

         说一说标准输入输出和文件读写的相似和不同吧, 请看下面代码:

        #include<iostream>        int main()       {             std::cout<<"hello world!"<<std::endl;             return 0;       }

       这是所有程序员都会经过的入门级程序, 但 我想思考几个问题:

问题1, 为什么要包含iostream头文件?

问题2, std::cout是个什么东西?

问题3, std::endl是个什么东西?

问题4, <<是个什么东西?


初步分析下程序的内容:

C++的输入输出都是基于流的考虑,并有缓存区的概念; 输入流:istream; 输出流:ostream;

C++的库文件中  定义了streambuf类,为缓存器分配内存, 填充缓存区,访问缓存区,刷新缓存区,管理缓存区内存等类方法;

                             定义了ios_base类, 表示流的一般特征,是否可读取,二进制流还是文本流等;

                             定义了ios类, 基于ios_base类,其中包括一个指向streambuf对象的指针函数;

                             ostream类,从ios类派生而来,提供输出的方法;

                             istream类,从ios类派生而来,提供输入的方法;

                            iostream类, 基于istream和ostream(从名字也能看出来),因此继承了输入和输出的方法。

因此问题1的答案可知: 因为iostream头文件中 包含了输入和输出的方法, 我们可以用来输出我们的内容。

 我们知道C++都是基于对象的操作,   可想而知 cout 则是 ostream的对象, 而且是库给我们提前声明了,创建了ostream对象,则就打开了一个流,并创建了流的缓存区,和关联对象(cout默认关联到显示器), 有了缓存有了关联对象,我们可以直接调用输出的方法,将输出的内容 输出到显示器上。

             可以猜到 << 就是重载的运算符, 能识别C++的所有基本类型, 将右侧的字符串 “hello world” 添加到缓存区中。 当然cout对象也有其他显示的方法,比如cout.put()用于显示字符,cout.write()用于显示字符串, 但不太常用。

            说道std::endl 不得不说缓存区的刷新机制, 为了保证程序的运行速度, 一般在缓存区满了之后,一次将缓存区的内容写到屏幕或文件,  但有时需要提前输出, 则有几个方法,比如运行flush控制符, 还有一种方法 就是在碰到换行符时 也会刷新。

            endl也是一个控制符,他的作用是: 刷新缓冲区,并插入一个换行符。


           到目前为止, 4个问题基本回答完毕, 我们来看看文件操作,并比较下不同。

#include<iostream>#include<fstream>int main(){std::ofstream fout;               //创建流对象fout.open("log.txt",std::ios::app|std::ios::binary);           //关联流对象与输出目标fout<<"hello world!"<<std::endl;          //调用输出方法 进行输出。return 0;}

文件操作与标准输入输出类似, fstream类继承了 文件输入类ifstream和文件输出类ofstream类的方法。

        用ofstream类来声明一个对象,名称为fout, 此时  创建了缓存区;

                       对象的open方法, 则将一个流与目标关联上,表示输出的目标是log.txt文件;

                      使用重载符<<进行输出。


其实标准输出和文件操作是相似的,都是C++的IO操作 ,都需要经过三步, 打开一个流, 流与一个目标关联, 输出流。

请看下面的异同之处:
 标准输出文件操作流对象创建库已经声明cout对象自己通过ofstream声明输出流对象流关联cout默认关联到显示器自己通过open方法进行关联输出流使用<< 使用<<

由上面的比较可知: 其实操作都是一样的,只是 标准输出 由库文件提前给我们做了两步而已, 所以叫做标准输出。 而文件操作,这三步都需要自己指定。 

                                  因为可以打开多个文件,就需要创建多个流, 所以需要我们自己声明流对象, 库文件不可替我们声明, 因为他不知道要声明多少个;

                                 因为输出的文件不同, 所以关联需要我们自己做,因为库文件不知道我们的输出位置。


仔细想想, 其实每一步操作都是有意义的, C++标准库 为我们做了一部分事情, 有很多事情还是需要自己来做。

仔细思考,很多事情都是类似的, 与一反三。


写文件和标准输入  与之类似,就不在这废话了。


             






原创粉丝点击