2010-03-21 33 views
0

好吧,所以我有getline的問題。C++如何正確使用ifline成員的getline

我有一個包含幾個字符串的文件。我自己創建了它,並且我將每個字符串放在一條單獨的行上。

Ex. textfile.txt 
    Line 1 
    Line 2 
    Line 3 
    Line 4 

//Little snip of code 
    ifstream inFile("textfile.txt"); 
    getline(inFile, string1); 

當我調試程序,並要求它打印出字符串1就顯示,「1個線\ r」被保存到字符串1。我知道這是從我創建文件時實際觸及輸入。此問題會導致我的程序出現分段錯誤。我知道我的代碼的工作原理,因爲如果我使用ofstream先寫入文件然後再讀入它,它就可以工作。

因此,對於我的問題,無論如何不使用getline函數來獲取轉義序列\ r?如果我不清楚只是讓我知道。

+0

這裏沒有足夠的代碼來確定問題的原因。 – msw 2010-03-21 04:01:08

+0

我們可以看到更大的代碼樣本嗎? – RobS 2010-03-21 04:13:24

+0

如果您正在調試器中檢查sd :: strings,那麼在字符串末尾可能會有「額外」字符 - 這是可以預料的,考慮到字符串的性質並且不是bug,您需要在檢查它們時考慮到字符串的大小()。 – 2010-03-21 09:57:15

回答

0

如果你的標準庫的正確實施,終止字符應該從流中移除,但不附加到字符串。即使它被添加到字符串中,也不應該導致段錯誤 - 我認爲你的問題在別處。

1

您擁有'\ r'字符的事實本身不太可能導致seg故障。

其他未解之謎:
如果你打開一個文件以二進制寫輸出正是你的輸出。
如果你打開一個文件以文字寫入(默認),輸出是相同的,除了'\ n',它被轉換成一個行終止序列(更多在下面)。

如果您打開一個用於讀取二進制文件的文件,輸入文件就是文件中的內容。
如果您打開文件以讀取文本(默認設置),則輸入與文件相同,除了行結束符序列(它被轉換爲字符'\ n')。

在正常情況下,這很好。但是每個平臺似乎都有自己的線路終端序列定義。因此,如果您在MAC上編寫文本文件,然後在PC上讀取它可能無法按預期工作。

所以,除非你正在做以下其中一項,否則一切都應該起作用。

  • 寫作二進制/讀取的文本/
  • 寫作文本在二進制
  • 閱讀寫作的文件和OS2
    • 凡OS1/OS2沒有OS1 /讀取文件相同的線路終止順序。

注1:如果你寫在二進制模式的文件。你不應該使用getline(),它假定文本模式(它期望的行終止序列分割線)。 Sub注意:對於那裏的學生(),getline()可能在二進制文件上工作,但這可能依賴於實現細節,您不應該考慮它的便攜性。注意2:上面假設你沒有安裝一個專門的本地實現一個方面,可以即時轉換流數據。