以前在windows下总喜欢使用CFile类来操作文件,最近改用fopen系列函数,却没想到一个不经意的问题让我调试了一整天。打开文件使用的代码如下:
FILE* fh = fopen("c:/filename", "r");
缺省情况下(当然可以进行设置),文件是以文本模式打开的,因为我们没有使用b标记。这个时候,如果文件数据中含有0x1a就有麻烦了。每当读到0x1a的时候,文件的位置会跳到4096(ftell返回的结果),如果文件小于4096字节的话,那么调用fgetc得到的结果是EOF。另外,ftell返回的结果也和文件的物理位置不一致,这使得我们在不自行跟踪读取进度的情况下,无法确定读到什么位置(调用ftell)以及还有多少字节可读(文件长度-ftell(fh))。所以,调用fopen的时候还是加上b标记为好(二进制模式)。文本模式的操作估计多用于stdin和stdout这两个特殊的文件句柄,因为这个时候0x1a相当于按键CTRL+Z。