簡體   English   中英

在cout中奇怪的錯誤打印getline()字符串

[英]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 ,只有\\ngetline吃掉,而在第二行上讀到同樣的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM