最近写了一个读unicode文本的函数,是用fread函数读,但有时候不能读完,后来网上查了下,见下文:
最近写一个程序,发现用fread读“.dat”文件时不能读完整个文件,后来用hex格式观察读文件退出位置的数字,才发现只要是读到0x1A时,fread就认为结束!后来看了MSDN后知道用text模式打开文件时,系统默认CTRL+Z为文件结束符,而0x1A刚好就是CTRL+Z的ASCII码。另外在另一个文章里面说到如果遇到“/r/n”,也将被映射为“/n”。因此如果是读普通数据而非文本,以以下格式打开文件。
datafile = fopen("whatever.dat", "rb"); 这样就可以解决以上问题!
在MSDN中,对于"t"和"b"打开模式的原文如下:
Also, in text mode, carriage return–linefeed combinations are translated into single linefeeds on input, and linefeed characters are translated to carriage return–linefeed combinations on output. When a Unicode stream-I/O function operates in text mode (the default), the source or destination stream is assumed to be a sequence of multibyte characters. Therefore, the Unicode stream-input functions convert multibyte characters to wide characters (as if by a call to the mbtowc function). For the same reason, the Unicode stream-output functions convert wide characters to multibyte characters (as if by a call to the wctomb function).
If t or b is not given in mode, the default translation mode is defined by the global variable _fmode. If t or b is prefixed to the argument, the function fails and returns NULL.