【问题标题】:Unix c++: getline and line.empty not workingUnix c++:getline 和 line.empty 不起作用
【发布时间】:2014-01-01 21:14:36
【问题描述】:

大家新年快乐!

我有一个如下所示的文本文件:

A|AAAAA|1|2
R|RAAAA
R|RAAAA

A|BBBBB|1|2
R|RBBBB
R|RBBBB

A|CCCCC|1|2 
R|RCCCC

以下代码根据key在文件中搜索相关文本,并返回所有属于该key的行:

while( std::getline( ifs, line ) && line.find(search_string) != 0 );

if( line.find(search_string) != 0 )
{
    navData = "N/A" ;
}

else{

    navData = line + '\n' ; // result initially contains the first line

    // now keep reading line by line till we get an empty line or eof
    while( std::getline( ifs, line ) && !line.empty() )
    {
        navData += line + '\n';
    }
}

ifs.close();
return navData;

在 Windows 中,我得到了我需要的东西:

A|BBBBB|1|2
R|RBBBB
R|RBBBB

然而,在 Mac 中,代码“&& !line.empty()”似乎被忽略了,因为我得到以下信息:

A|BBBBB|1|2
R|RBBBB
R|RBBBB

A|CCCCC|1|2
R|RCCCC

有人知道为什么吗?

大家干杯!

【问题讨论】:

  • 第一个while之后的;是故意的吗?
  • 是的。以这种方式工作。干杯,
  • {} 会更清楚。我最初错过了;,想知道你为什么在一个陌生的地方重复.find 条件:P

标签: c++ unix getline


【解决方案1】:

Windows 和 Mac 对空行的外观有不同的看法。在 Windows 上,行由"\r\n" 终止。在 Mac 上,行以"\n" 终止,前面的"\r" 导致行不为空。

【讨论】:

  • 作为参考,这是有ios_base::binary 标志的一个重要原因。使用二进制模式的输出流,您所写的就是所写的;在文本模式(默认)下,可以翻译行尾,以便(例如)\n 变为\r\n。 *nix 通常不会区别对待这两者,但 Windows 通常会这样做。 (出于类似的原因,您的文本编辑器通常也允许您指定行终止符。)
  • 好的。那么考虑到这一点,我应该如何解决我的问题呢?谢谢!
  • 所以你想成为using getline() with multiple types of end of line characters?我敢肯定,既然您知道问题出在哪里,您就会找到解决方案。
  • 奥斯瓦尔德,非常感谢!在您的一个链接中找到的函数 safeGetline 成功了!非常感谢!
猜你喜欢
  • 2013-10-15
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多