C++ MSVC和g+中的不同行尾+;

C++ MSVC和g+中的不同行尾+;,c++,parsing,visual-c++,g++,C++,Parsing,Visual C++,G++,我正在尝试解析文件中的文本,其中必须检测空行。 我在两个地方运行代码: 2019年visual studio(MSVC)第10场胜利 在WSL下,ubuntu 20.04,g++ 同样的计算机,同样的文件,同样的代码 while (getline(inputFile, line)) { if (line.length() == 1) { std::cout << "Empty line" << std::endl;

我正在尝试解析文件中的文本,其中必须检测空行。 我在两个地方运行代码:

  • 2019年visual studio(MSVC)第10场胜利
  • 在WSL下,ubuntu 20.04,g++
同样的计算机,同样的文件,同样的代码

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

std::cout您的困难源于在同一台机器上混合使用Windows和Linux行结束符的事实。WSL是一个类似Linux的环境,在WSL上处理Windows文件与在真正的Linux机器上处理Windows文件没有什么不同,即有问题

去除
\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;
    }
while(std::getline(inputFile,line))
{
如果(!line.empty()&&line.back()='\r')
{
line.pop_back();
}
if(line.empty())
{

std::cout
\r
\n
可以取代神奇的数字10、13。行尾的约定取决于操作系统。有Windows约定(
\r\n
)和Unix约定(
\n
),老前辈记得经典的(在OS X之前)Mac约定(
\r
)。如果在不同的操作系统之间传输文本文件,则需要使用某种工具对其重新编码,或者准备分析程序中的不同行尾。Unix程序自然会将
\r
视为常规字符,而不是行尾序列的一部分。丢弃它是您的责任。注意:D在空行上运行
行[0]
会使程序具有未定义的行为。您可能需要检查常见的
unix2dos
dos2unix
工具,它们在
\n
之前添加或删除
\r
if (int(line[0]) == 10 || int(line[0]) == 13)
{
    std::cout << "Empty line" << std::endl;
}
while (std::getline(inputFile, line))
{
    if (!line.empty() && line.back() == '\r')
    {
        line.pop_back();
    }
    if (line.empty())
    {
        std::cout << "Empty line" << std::endl;
    }