1. 程式人生 > >C++文字流fstream在Linux和Windows中換行的處理問題

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 就能完整檢視文字檔案完整換行符