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;
}