深入理解C++中的文件操作

2020-01-06 16:27:11王冬梅

二进制文件(Binary files)

在二进制文件中,使用>,以及函数(如getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法的。

文 件流包括两个为顺序读写数据特殊设计的成员函数:write 和 read。第一个函数 (write) 是ostream 的一个成员函数,都是被ofstream所继承。而read 是istream 的一个成员函数,被ifstream 所继承。类 fstream 的对象同时拥有这两个函数。它们的原型是:


write ( char * buffer, streamsize size );
read ( char * buffer, streamsize size );

这里 buffer 是一块内存的地址,用来存储或读出数据。参数size 是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。


// reading binary file
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
 const char * filename = "example.txt";
 char * buffer;
 long size;
 ifstream file(filename, ios::in|ios::binary|ios::ate);
 size = file.tellg();
 file.seekg(0, ios::beg);
 buffer = new char [size];
 file.read(buffer, size);
 file.close();
 cout <<"the complete file is in a buffer";
 delete[] buffer;
 return 0;
}
//The complete file is in a buffer

缓存和同步(Buffers and Synchronization)

当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起。这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介。例如,对于一个输出流, 每次成员函数put (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中。

当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话)。这个过程称为同步(synchronization),它会在以下任一情况下发生:

      当文件被关闭时: 在文件被关闭之前,所有还没有被完全写出或读取的缓存都将被同步。

      当缓存buffer 满时:缓存Buffers 有一定的空间限制。当缓存满时,它会被自动同步。

      控制符明确指明:当遇到流中某些特定的控制符时,同步会发生。这些控制符包括:flush 和endl。

      明确调用函数sync() : 调用成员函数sync() (无参数)可以引发立即同步。这个函数返回一个int 值,等于-1 表示流没有联系的缓存或操作失败

在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:

1、插入器(<<)