【问题标题】:Getline and 16h (26d) characterGetline 和 16h (26d) 字符
【发布时间】:2010-05-29 16:19:56
【问题描述】:

在 VC++ 环境中,我使用(字符串)getline 函数来读取打开文件中的单独行。问题是 getline 将字符 1Ah 作为文件结尾,如果它存在于行上,则整个读取过早结束。有什么解决办法吗?

代码sn-p:

fstream LogFile (Source,fstream::in);
string Line

while (getline(LogFile,Line))
{  ....  }

文件内容:

line1text1asdf
line2text2asd //EOF for getline here
line3asdas // this line will never be read by getline

感谢您提供任何信息。

克拉

【问题讨论】:

    标签: c++ getline


    【解决方案1】:

    是的,Ctrl+Z 是古代操作系统中文本文件的 EOF 文件字符。它是一个真正不应该出现在文本文件中的控制字符,你不能有意义地翻译它。如果需要,Openmode::binary 几乎是您所能做的。

    【讨论】:

    • 不幸的是,我无法选择存储在文本文件中的内容和不存储的内容:/ 我从没想过 Windows 会像 CP/M OS 那样处理文本文件。
    • Windows 与它无关,它不知道有关文本文件的 bean。 Ctrl+Z 检测代码位于 CRT 中。
    【解决方案2】:

    将 getline 替换为手动函数,该函数按您的定义逐个字符读取直到行尾或 eof。

    【讨论】:

    • 该死的我以为可能有更简单的方法。谢谢。
    【解决方案3】:

    我通常更喜欢以二进制形式打开文件,使用下面的函数读取数据,并解析 '\n' 和 '\r' 以检测行尾。

    UINT xread(HFILE hfile, void *buf, UINT size)
    {
       UINT ret;
    
    
       #if defined(_WIN32)
    
       ret = _read(hfile, buf, size);
    
       #elif defined(_LINUX) || defined(__APPLE__)
    
       ret = read(hfile, buf, size);
    
       #endif
    
    
       return(ret);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2011-04-02
      • 2013-12-17
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多