首页 文章

为什么我会在没有std :: ios :: binary的情况下打开文件(std :: ifstream)?

提问于
浏览
8

这可能恰好属于Stack Exchange的不同部分,但我不这么认为 - programmers.se更多的是关于其他事情 .

回答问题:你可以用std :: ios :: binary做一些你无法在文本模式下做的事情(例如相对搜索),但是我无法在文本模式下找到任何你无法在二进制模式下做的事情 - 甚至用例如文本作为文本读取文件的std ::函数getline()

那我为什么要打开文字呢?作为一个可能相关的问题,为什么不默认打开二进制?那个用例会破坏吗?

EDIT Additional information

这是让我问的问题:

我有一个在Windows系统上创建的文件 - 也就是说,行结尾是CR LF .

我用 std::ifstream 使用 std::ios::binary 标志打开它

我正在使用_2559214解析文件并获得我期望的行为 - getline一次读取一行 .

系统:Windows 7专业版

编译器:g代表MINGW32

2 回答

  • 7

    你在文本模式下可以用二进制文件做什么?阅读文字,适合初学者 . 以文本模式打开的文件会在内部自动转换 '\n' 字符,以及系统用于在外部分隔文件中的行的任何内容 . 即使底层系统要求文件大小为某个固定大小的倍数,它也可以识别文件的任意结尾 .

    今天的选择有点复杂,因为您经常需要从不兼容的系统访问文件 . 如果您在Windows和Unix上都安装了文件系统,请在Windows下将其写为文本,并在Unix下将其作为文本读取,然后您将看到额外的字符 . 在这种情况下,最好是读取和写入二进制文件,并根据您喜欢的任何约定自己进行行结束处理 . 类似地,如果“文件”实际上是一个套接字,与另一台机器通信,您将需要以二进制形式打开它,并根据协议的要求自己处理行结尾 .

  • 2

    默认情况下,stdin在文本模式下打开,这允许使用例如CTRL Z来表示EOF,所以我不明白为什么你认为除了二进制模式之外没有“需要”打开流 .

相关问题