注:图片来自于博客 http://blog.163.com/hbu_lijian/blog/static/126129153201201710456994/
fstream 中IO对象常用的是iftream(文件输入流) ,ofstream(文件输出流),用来读写文件。
最近工程中用到socket 接收收据,接收到的数据是一个图像,接收完之后用于打印,由于图像接收完整之后才能打印。 一开始我就想建立一个文件保存数据,等保存完毕之后在打开一个文件,读入数据流然后用于打印。结果发现在大规模的接收文件时候效率很低。
我在想是否可以既有输入又有输出特性,我想到了管道。但有觉得不合适。我不可能为每一个文件都去建立一个管道。而且管道占用内核空间。自信查看IO发现输入输出双向IO。写测试代码如下:
fstream fs; fs.open("test.txt",ios::binary|ios::out|ios::in); //|ios::out); if (!fs.good()) { return -1; } char buf[1024] = {"wxr test shuru shu chu liu de hao huai"}; fs.write(buf,strlen(buf)); fs.flush(); char buf2[1024] = {0}; fs.seekg(ios::beg,0); fs.read(buf2,strlen(buf)); fs.close(); return 0;
惊奇发现写入和读出都行,只是在写完之后读取的时候将文件指向开始。 最后我的问题如愿解决。
深思:只考虑线程间使用管道通信。这个类有管道的特性。又有管道所不具备的优势。只要做好同步 一个线程写数据(文件末尾) , 一个线程读数据(文件开始),读取时候可以检查数据的完整性在做读取操作,因为是文件所以数据不会丢失,不像管道读取之后数据丢失。 所以在线程间通信尤其数据量大的时候我觉得可以采用该类。