[英]std::fstream different behavior on msvc and g++ with utf-8
[英]Different line endings in MSVC and 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 没有
您的困难源于您在同一台机器上混合 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.