1. 关于二进制与文本形式打开文件
以二进制形式打开文件需要通过ios::binary来控制:
std::ifstream inf;
inf.open(filename, ios::binary | ios::in);
打开方式与平台有关,在Linux、Unix系统中二进制与文本打开是没有差别的,windows系统会把'\n'换行符转换为"\r\n"。所以在window平台open一个文本文件且不说明ios::binary时,会对文本内容做换行符的转换。
int flen = 0;
inf.seekg(0, std::ios::end);
flen = inf.tellg();
inf.seekg(0, std::ios::beg);
int rlen = 0;
inf.read(buffer, flen);
rlen = inf.gcount();
if (inf.fail())
{
// 报错..
}
执行上面的代码,如果读取的文件有换行符,会发现flen > rlen,因为两个字节的换行符被转成了一个字节;同时inf的failbit被置位,因为当read函数读取的长度小于设置的长度的时候会设置该位。
2. readsome()的使用
该函数是非阻塞方式从缓冲区读取数据,用于读文件会无效果。可以用read() 和 gcount()来代替。当缓冲区有数据时调用get(),readsome会读到数据。