当前位置:C++技术网 > 资讯 > fwrite文本模式写入的回车换行符转换问题

fwrite文本模式写入的回车换行符转换问题

更新时间:2016-11-29 16:37:14浏览次数:1+次

    今天在写一个日志类,用于打印服务程序的信息。我将每一个日志信息都以单行的形式输入,所以在开头加上了回车换行符。文件是以代码如下:
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的解释如下图所示:
fwrite文本模式写入的回车换行符转换问题
    如果是这样的话,那转换的结果也应该是0D 0A 0A(即\r\n被替换为\r\r\n了)。事实上并不是。为了测试fwrite到底是对\r还是\n进行了转换,我单独对\r和\n字符进行了测试。
    测试的结果是,\r并没有做任何处理,而对\n进行了转换,即\n被替换为了\r\n。当然这个和前面看到的winhex的结果是一致的。\r\n被替换为\r\r\n,是对原始的\n进行了处理。而这个和msdn描述是不一样的。这里只能说明,msdn在这里描述有错误。
    因为我的日志函数都是写入文本,其实可以直接使用fprintf函数写入字符串。这个函数就不会对\r\n进行转换,msdn没有这个说明。
    fwrite这个函数的转换问题,可能会经常遇到,所以记录一下,供读者参考。