2014-03-19 59 views
-1

有沒有辦法區分第一個值(這是一個數字10保存爲unsigned char)與以下演示代碼中的換行符?無符號字節10與新行衝突

int main() { 

     unsigned char ch1(10), ch2('\n'); 
     std::cout << (int)ch1 << " " << (int)ch2 << std::endl; 
} 

輸出是

10 10 

欲寫入文件這樣的字符爲無符號字節,但也希望當在稍後的時間讀出的換行字符是來自數字「10」可區分。

有什麼建議嗎?

問候, 尼基爾

+0

其實你是輸出所有的文字表示!對於這種情況,不輸出爲'int'輸出(並且更​​喜歡'std :: endl'來輸出行尾)! –

+0

我不認爲鑄造是一個問題。 因爲,如果我改變了上面的代碼說 '如果(CH1 == CH2)的std ::法院<< 「平等\ n!」 <<的std :: ENDL;' 在沒有鑄造完成後,我的輸出結果是「Equal!」。 –

+0

_'我認爲它不會起作用.'_特別是**什麼**不起作用?詳細說明(請編輯你的問題!)。 –

回答

1

沒有辦法。你寫同一個字節,並且不保存其他信息。你需要考慮其他編碼你的值的方法,或爲你的哨兵保留一個值(如255或0)。當然,你需要確定,這個值在你的輸入中不存在。

其他可能性它使用一個字節值作爲'特殊'字符來逃脫你的控制代碼。與'\'類似,用於在'\ n'中爲'n'賦予特殊含義。但是它使得所有的解析更加複雜,因爲你的值現在可能是一個或兩個字節長。除非你在記憶方面承受着很大的壓力,否則我會建議將值存儲爲字符串表示形式,這通常更具可讀性。

+0

我同意...我認爲最好的方法是將原來的10轉換爲相當於ascii!謝謝 –

0

不,價值10字符是一個換行符。看看ascii table。你會看到數字10將是兩個不同的字符(分別爲49和48)。

+0

我同意。問題是有些文件不是我寫的,我想遵守原始數據庫。原始數據庫沒有任何換行符,因此更易於管理。我需要插入換行符,併產生問題:(。 –

+2

這聽起來像你想混合二進制和文本輸出?這似乎很奇怪,但你需要另一種方式來區分當你應該讀取一個字符二進制和什麼時候作爲文本 – benjamin