【问题标题】:Disabling Ctrl-Z behaviour in `ifstream::getline`在 `ifstream::getline` 中禁用 Ctrl-Z 行为
【发布时间】:2021-03-02 17:57:51
【问题描述】:

我想使用ifstream::getline 从文件中读取行,但是文件包含字节 Ctrl-Z (0x1A),这使得 getline 认为它已到达文件末尾(这是在 Windows 中——如果我没记错的话,在 *nix 中它会是 Ctrl-D)。我能否以某种方式禁用此行为,并告诉getline 忽略 Ctrl-Z?

仅供参考:该文件是WebAssembly testsuite 中的comments.wast,它测试了WebAssembly 解析器接受块注释中的任何和所有字符的能力。

【问题讨论】:

  • 我不认为\x1A 代表Ctrl+Z。 Ctrl+Z 和\x1A 都被解释为EOF,但它们似乎没有关联?
  • @HolyBlackCat:Ctrl-Z 的意思是 \x1A。 (Ctrl-A 是\x01,Ctrl-B 是\x02 等等)
  • 呵呵,谢谢,不知道是什么东西。

标签: c++ ifstream getline webassembly


【解决方案1】:

当您的 ifstream 对象使用二进制模式时,这不应该发生。 像这样创建它:

std::ifstream fin(<path>, std::ios::binary)

这当然会阻止您使用流的其他功能,但如果您的主要目标是能够在忽略特殊字符的情况下读取所有类型的值,那么这可能是要走的路。

【讨论】:

  • “阻止您使用流的其他功能”什么功能?
  • 例如,你必须小心 gcount() 和 unicode 字符串...
  • 我认为getline 只能用于以文本模式打开的文件,但我尝试了您的建议,效果很好。
  • 嗯,你是说ifstream 以某种方式处理 unicode?我认为文本模式只是让它将\r\n 转换为\n(显然,停在\x1A)。
  • @HolyBlackCat 当区域设置为imbue()'d 进入流时,流可以处理文本编码
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2014-11-03
  • 2012-04-01
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多