繁体   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