在 VS2019 中使用 fstream::getline 与在 VSCode 中使用得到不同的结果

Using fstream::getline in VS2019 Is Giving Me Different Results Than Using It With VSCode

所以我一直在学习 Steam,并且一直在自己试验。我试图编写一个简单的程序来只读取文件的第一行。 但我注意到 Visual Studio 2019 年的一个问题。 下面是代码片段。

#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream in("Test.txt", std::ios::binary);
    if (in)
    {
        std::string store;
        std::getline(in, store, '\n');
        std::cout << store;
    }
    return 0;
}

test.txt 文件内容如下:

This
Is
A
Test

在 VS19 中,控制台的输出只是“他的”。 在 VSCode 中,输出应该是“This”。 就可能的配置而言,我在 VS19 中做错了什么吗?这是一个错误吗? 在我尝试不同的 IDE 之前,这让我发疯,无法弄清楚为什么会那样做。 注意:它不会忽略字符串的第一个字符,而是用空格替换它。

VS2019 Test.txt 的十六进制

00000000    54 68 69 73 0D 0A 49 73 0D 0A 41 0D 0A 54 65 73 
00000010    74

和VSCode

00000000: 54 68 69 73 0A 49 73 0A 41 0A 54 65 73 74

您正在以二进制模式打开输入文件。这意味着 getline 将读取以下字节(它将丢弃换行符):

54 68 69 73 0D

这对应于以下字符串:

"This\r"

最后一个字符是回车符-return。

在问题的评论部分,您表示您在简单编写时遇到了同样的问题

std::cout << "This\r";

到控制台。在那种情况下,字符 T 也被覆盖了。这可能意味着这只是您的控制台处理回车符-return 字符的方式。

解决此问题的最佳方法是以文本模式而不是二进制模式打开文本文件。这样,"\r\n" 行结尾将自动转换为 "\n" 行结尾,您不必处理任何回车符-return。

因此,建议您换行

std::ifstream in("Test.txt", std::ios::binary);

至:

std::ifstream in("Test.txt");