FILE *file = fopen(log_file_name,"a+");
if (!file)return;
fwrite("\r\n",3,file);//这里不是原始代码,只用来说明问题
然后用winhex软件查看了十六进制的数据,结果发现\r\n对应的十六进制为0D 0D 0A。这很明显,和我的预期不一样。然后查看了msdn,msdn对于fwrite的描述是,以文本模式打开文件的时候,写入时会自动将\r转换为\r\n,不对\n进行处理。
msdn对于fwrite的解释如下图所示:
测试的结果是,\r并没有做任何处理,而对\n进行了转换,即\n被替换为了\r\n。当然这个和前面看到的winhex的结果是一致的。\r\n被替换为\r\r\n,是对原始的\n进行了处理。而这个和msdn描述是不一样的。这里只能说明,msdn在这里描述有错误。
因为我的日志函数都是写入文本,其实可以直接使用fprintf函数写入字符串。这个函数就不会对\r\n进行转换,msdn没有这个说明。
fwrite这个函数的转换问题,可能会经常遇到,所以记录一下,供读者参考。