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

最近在工作老是重复复制粘贴一些固定格式代码,就写个自动生成这些固定格式代码的小工具,发现个问题,就是程序在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 就能完整查看文本文件完整换行符

猜你喜欢

转载自blog.csdn.net/zhanghedong526/article/details/45689617