最近在工作老是重复复制粘贴一些固定格式代码,就写个自动生成这些固定格式代码的小工具,发现个问题,就是程序在Windows中写linux下的配置文件,出现回车换行(\r\n)和换行(\n)问题。
在程序写完两个配置文件后,打开其中一个配置文件发现每一行都有这个符号:(^M),然后查了下,把这些捋了下:
windows由于历史原因文本文件中换行用(\r\n),就是一个回车\n定位到行首,然后换行\r到下一行相同位置。
linux/unix中换行用(\n)就是一个\n直接定位到下一行行首。
c++写入文本的时候
</pre></p><p><span style="white-space:pre"></span><pre name="code" class="cpp"><span style="font-family:Microsoft YaHei;"><span style="white-space:pre"></span><span style="white-space:pre"> </span><span style="font-size:18px;">ofstream ofstre;
<span style="white-space: pre;"> </span><strong>ofstre.open(this->metadataFileName,ofstream::app);</strong>
if(ofstre.is_open())
{
ofstre<<"\n";
ofstre.flush();
ofstre.close();
}
else
{
cout<<"=====写入文件异常====="<<endl;
ofstre.close();
return n_acmanager::RETURN_FAILED;
}
return n_acmanager::RETURN_SUCCESS;</span></span>
这段默认以文本形式打开文件,会自动把代码中输出换行转化为相应系统的换行(\n或者\r\n)
如果想要在DOS环境下输出换行不自动转换为(\r\n),则要以二进制的形式打开文件:
扫描二维码关注公众号,回复:
2673253 查看本文章
<span style="font-family:Microsoft YaHei;font-size:18px;"><span style="white-space: pre;"> </span><strong>ofstre.open(this->metadataFileName,ofstream::app | ofstream::binary);</strong></span>
但是如果这样操作DOS格式的文本文件就会引起个小问题,像vim这种能识别文本文件格式的程序就会把他识别成unix格式文件,进而隐藏的^M就会被显示出来。
写入前识别为DOS格式:
写入后识别为UNIX格式:
linux下用cat -v filename 就能完整查看文本文件完整换行符