C++文本流fstream在Linux和Windows中换行的处理问题

来源:互联网 发布:think in java第五版 编辑:程序博客网 时间:2024/06/06 15:04

最近在工作老是重复复制粘贴一些固定格式代码,就写个自动生成这些固定格式代码的小工具,发现个问题,就是程序在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),则要以二进制的形式打开文件:

<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 就能完整查看文本文件完整换行符

0 0
原创粉丝点击