[英]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.