1. 程式人生 > >C++讀寫檔案時,0A轉化為0D 0A

C++讀寫檔案時,0A轉化為0D 0A

用C++寫東西,需要往檔案裡寫資料,很簡單的程式碼,大概是這個樣子:

#include <fstream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 ofstream fout;
 fout.open("d:\\test.dat");

 int a = 0x7788;

 fout.write((char*) &a, sizeof(int));
}

開啟test.dat,內容是77 88 00 00,很正常。

開啟test.dat,內容是77 88 00 00,很正常。

但我要是把a的值改成0x0a,毛病就出來了,寫出來的東西是:0D 0A 00 00 00!


要是把a改成0x770a或者是別的什麼0a,只要是數字中某一個位元組是0a,寫出來以後肯定變成0D 0A!比如0x770a就變成0D 0A 77!

更讓人寒的是,即使規定寫出的只能是一個位元組,即寫:
 fout.write((char*) &a, sizeof(char));
只要a的值的高位元組是0A,寫出來一樣變成0D 0A!也就是指定輸出1個位元組,實際卻輸出了2個位元組!

真是讓人費解啊。我一度認為C++出現了有史以來最莫名其妙的BUG,不過,且慢……

0A是什麼?0D 0A又是什麼?這個問題的解原來在這裡。先查查C++的文件,裡面說明,ofstream的open函式,第二個引數指明開啟方式,預設為ios_base::out,即按照位元組流的方式輸出文字。再看看0A到底是什麼,原來ASCII的0A是換行,也就是\n,再想想,Windows系統下的換行是如何處理的?\r\n啊。原來……


原來按照位元組流的形式輸出文字時,ofstream會自動將輸出的\n變成\r\n,以適應WIndows系統,結果以輸出資料的角度看來,這個正常的舉動就變成了不可解的“0A變成0D 0A”。

既然如此,答案也出來了,查查文件,將開啟檔案的一句改成:
fout.open("d:\\test.dat", ios_base::out | ios_base::binary);
搗亂的0A終於歸位了。

對於用fwrite寫檔案則要把引數設為wb才行~

相關推薦

C++檔案0A化為0D 0A

用C++寫東西,需要往檔案裡寫資料,很簡單的程式碼,大概是這個樣子:#include <fstream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ ofstream fout; fout.o

python 檔案r、rt、rb、r+的區別

文字檔案中的 回車 在不同作業系統中所用的字元表示有所不同。 Windows: \r\n Linux/Unix: \n Mac OS: \r python讀寫檔案 open()中 r rb rt rt模式下

C++檔案處理UTF8檔案處理GBK中文字元

讀檔案 //從檔案中提取詞典 void getLexiconFromTrainData(char* filepath){ maxLength = 0; lexicalItemCount=0; allSentenceCount=0; wordCount=0

C++檔案相關(包括一行行讀取資料讀取每一行資料的第一個數)的函式

1.setprecision()函式的使用及標頭檔案? 2.利用getline()怎麼讀取一行資料,換行符是否讀入了? 3.怎麼使用串流實現對string字串的輸入輸出? 寫資料到txt檔案 //其中的setprecision()函式在標頭檔案iomanip 中

C#檔案的所有方法總結

計算機在最初只支援ASCII編碼,但是後來為了支援其他語言中的字元(比如漢字)以及一些特殊字元(比如€),就引入了Unicode字符集。基於Unicode字符集的編碼方式有很多,比如UTF-7、UTF-8、Unicode以及UTF-32。在Windows作業系統中,一個文字檔案的前幾個位元組

圖解 | 當我們在 Socket 我們究竟在什麼?

套接字socket是大多數程式設計師都非常熟悉的概念,它是計算機網路程式設計的基礎,TCP/UDP收發訊息都靠它。我們熟悉的web伺服器底層依賴它,我們用到的MySQL關係資料庫、Redis記憶體資料庫底層依賴它。我們用微信和別人聊天也依賴它,我們玩網路遊戲時依賴它,讀者們能夠閱讀這篇文章也是因為有

c/c++ /檔案

利用c++的stream類 標頭檔案:#include <fstream> 1.讀檔案 string strRes; string strPath = “/opt/test/test.txt”; if (access(strPath .c_str(),

mysql使用mycat分離報 Connection is read-only. Queries leading to data modification are not allo

解決方法 MySQL自身會對只讀事務做優化,這是MySQL5.6.5 版本以後才出現的。 http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_tx_read_o

C#檔案宜取方式.md

C#讀寫檔案宜取方式 首先,不推薦用如下方式讀寫 //讀 using (FileStream fs = File.OpenRead(filePath)) { byte[] b = new byt

hadoop在sequence檔案會將檔案拷貝兩份然後進map處理

讀取sequencefile,在設定輸入路徑的時候,如果設定成 SequenceFileInputFormat.addInputPath(job, new Path(args[0])); 則會把檔案拷貝兩份。 正確的還是應該設定成: FileInputFormat.s

C++檔案操作

原文來自:http://blog.csdn.net/study16/article/details/5879428 來源:http://www.javaeye.com/topic/383903 讀 《C++ Primer Plus》第17章4-7節 一     頭 

c++檔案設定的位置

檔案定位  和C的檔案操作方式不同的是,C++ I/O系統管理兩個與一個檔案相聯絡的指標。一個是讀指標,它說明輸入操作在檔案中的位置;另一個是寫指標,它下次寫操作的位置。每次執行輸入或輸出時,相應的指標自動變化。所以,C++的檔案定位分為讀位置和寫位置的定位,對應的成員函式是

java檔案nio、bio對比

1.   基本 概念     IO 是主存和外部裝置 ( 硬碟、終端和網路等 ) 拷貝資料的過程。 IO 是作業系統的底層功能實現,底層通過 I/O 指令進行完成。所有語言執行時系統提供執行 I/O 較高級別的工具。 (c 的 printf scanf,java 的面向物

C檔案操作總結

FILE *fopen( const char *filename, const char *mode ); 一、對已經存在的檔案進行讀寫 mode: “r”—— Opens for reading. “r+”—- Opens for

RandomAccessFile 檔案內容去除亂碼

一、開發過程中遇到問題: (1)檔案內容只能等長替換,如果檔案內容少了就會亂行。 解決辦法:我主要是進行xml檔案內容解析的,用新增隨機字串的方式進行了解決,這樣既不影響檔案內容解析,也把問題解決了。 二、程式碼: public class FileUtils {

在用c++讀取xml檔案執行出現以下錯誤:出現未處理的“System.Xml.XmlException”型別的異常出現在 system.xml.dll 中

各位高手,我剛剛開始接觸c++,使用的是Microsoft Visual Studio 2003版本,在使用c++讀取xml檔案時,編譯已經通過,但是執行.exe程式時,老是出現這個錯誤:“未處理的“System.Xml.XmlException”型別的異常出現在 syste

C++檔案儲存至容器list中

C++讀寫檔案及容器list基本操作       大家在開始入門C/C++時,都要練習個學生管理系統啥的,主要都為了進一步掌握所學知識,並能使用這些知識。其中這個小專案的重難點就在資料的操作了,其中如

C#檔案中文亂碼

讀寫檔案的時候,檔案中存在中文字元; 直接讀取會出現亂碼,然後一搜索網上的各種亂碼處理方法,大多數是對讀取的string進行轉碼。 其實有一種簡單的方法,就是直接在讀取的時候就設定編碼,程式碼如下:

C檔案--刪除指定的一行

#include <stdio.h>#include <string.h> void InsertLine(char* FileName, int Line, char str[256]);void deleteLine(char* FileName,

C#檔案總結

方式一:用FileStream //例項化一個儲存檔案對話方塊 SaveFileDialog sf = new SaveFileDialog(); //設定檔案儲存型別 sf.Filter = "txt檔案|*.txt|所有檔案|*.*"; //如果使用者沒有輸入副檔名,自動追加字尾 sf.AddExten