簡體   English   中英

MSVC 和 g++ 中的不同行尾

[英]Different line endings in MSVC and g++

我正在嘗試解析文件中的文本,我必須在其中檢測空行。 我在兩個地方運行代碼:

  • 贏得 10,視覺工作室 2019(MSVC)
  • 在 WSL 下,ubuntu 20.04,g++

相同的計算機,相同的文件,相同的代碼。

while (getline(inputFile, line))
{
    if (line.length() == 1)
    {
        std::cout << "Empty line" << std::endl;
    }
/*blabla*/

使用此代碼 MSVC 不會打印空行,g++ 會。


if (line.empty())
{
    std::cout << "Empty line" << std::endl;
}

使用此代碼,MSVC 會找到空行,而 g++ 不會。


if (int(line[0]) == 10 || int(line[0]) == 13)
{
    std::cout << "Empty line" << std::endl;
}

使用此代碼 g++ 找到空行,MSVC 沒有

  1. 是改變行尾還是編譯器的 Linux kernel ?
  2. 在每個系統上始終檢測行尾和空行的正確方法是什么?

您的困難源於您在同一台機器上混合 Windows 和 Linux 行尾。 WSL 是一個類 Linux 環境,在 WSL 上處理 Windows 文件與在真正的 Linux 機器上處理它們沒有什么不同,即有問題。

std::getline \n (0x0A) 行尾,另外在 MSVC 中,以文本模式讀取文件會自動去除\r (0x0D) 字符。 后者不會發生在 Linux 上。

因此,在非 Windows 平台上讀取 Windows 文本文件(以\r\n行結尾)將刪除\n但將\r留在行尾。

如果你想處理這種情況,你可以手動去除尾隨的\r 例如

while (std::getline(inputFile, line))
{
    if (!line.empty() && line.back() == '\r')
    {
        line.pop_back();
    }
    if (line.empty())
    {
        std::cout << "Empty line" << std::endl;
    }

調試時以二進制模式打印出該line通常很有幫助,因為\r\n是不可見字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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