代码
代码中有几个重要的地方在下文中做下说明。
1.关于文件输出流中的刷新问题
我们写入writfile中的数据实际上是存在于缓存中,并没有真实写到文件中,此时就需要手动的触发刷新机制,可以通过以下方式触发:
1.执行flush成员函数;
2.执行close成员函数;
3.等待输出流对象执行析构函数;
4.按行输入时加入endl,需注意此时会额外增加’\n’字符。
这里要着重说的一种方法是,在写数据前,执行
setf(ios::unitbuf)
设置之后,写入流中的数据会不经过缓存直接写到文件中去,这样的好处是可以避免程序崩溃导致重要数据没有写入到文件中去。
2.seekg/seekp,tellg/tellp函数的使用
seekg/seekp这两个函数可以移动读取和写入文件时游标的位置,以代码中的seekg为例,文件读入流对象readfile在每次进行读操作时都会悄悄的移动光标位置,我们要向从头读取的话必须重新将读取游标放在开始位置。
使用tellg/tellp可以知道当前游标位置,一般开始位置为0,末尾位置为字节总数。
3.关于eof
只有在读到文件结束符时,执行eof才会返回非0值,代码中最开始我读取了89个字节后,以为此时eof会返回非0值,实际没有,查了资料后才明白,因为没有读到文件结束符,所以不会返回非0。后续在多次getline之后,eof会返回非0值了。
4.关于getline函数
输入输出流中存在另个getline函数,一个成员函数,另一个全局的,代码中用的是全局的的。
istream& getline (char s, streamsize n, char delim );* //成员函数
istream& getline ( istream& is, string& str, char delim ); //全局函数
5.rdbuf()接口
使用rdbuf接口可以很方便的将输入流的数据输出到输出流中。