[英]Strange error printing getline() strings in cout
當我在測試用例的輸入中遇到一個奇怪的問題時,我正在嘗試測試我的類。 我試圖簡化輸入以查看問題所在,因此在下面創建了該程序。
#include <iostream>
#include <string>
int main()
{
std::string number;
while (std::getline(std::cin, number))
{
std::cout << std::string(number) << " ";
}
}
基本上,我要獲取文本的每一行,並使用getline()將其存儲在字符串變量中。 然后,我使用std :: cout顯示每個字符串,並附加一個空格字符。
我的輸入文件包含以下內容:
one six
one seven
預期的輸出應如下所示:
one six one seven
但是,我得到的是:
one seven
這是空格字符,后跟輸入的第二行。 它忽略輸入的第一行。 我知道事實是每一行都可以正確讀取,因為當我用以下代碼替換代碼時,它們可以正確顯示:
std::cout << std::string(number) << std::endl;
這個錯誤對我來說是很新的。 這里發生了什么事? 有人可以解釋嗎? TIA!
好的,很清楚。
輸入文件必須為:具有正常Windows EOL的one six\\r\\ntwo seven\\r\\n
。
當您在cygwin下閱讀時,首先讀到one six\\r
,只有\\n
被getline
吃掉,而在第二行上讀到同樣的one seven\\r
。
因此,您這樣寫: one six\\r one seven\\r
(以空格結尾)。 但是,僅\\r
會將Curson放回同一行的第一列,然后第二行首先擦除。
通常,如果用將光標移到新行上的std::eol
替換結尾的空格,則該問題是不可見的。 選項卡( \\t
)確實是一種特殊情況:將光標完全放在期望的位置的第八列上,但這只是偶然。 如果將兩行反轉,則將更加明顯,因為您會在第二行的末尾看到第一行的其余部分。
您可以通過將輸出寫入文件並進行編輯來確認。
我可以在帶有Windows EOL的Linux下重現它。 這樣做的原因是Cygwin緊密模仿Unix-Linux並僅使用\\n
Unix EOL約定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.