为什么我打开一个没有std :: ios :: binary的文件(std :: ifstream)?

问题描述:

这可能正确地属于Stack Exchange的不同部分,但我不这么认为 - 程序员.se更多地是关于其他事情。为什么我打开一个没有std :: ios :: binary的文件(std :: ifstream)?

回答这个问题:有些事情你可以用std :: ios :: binary做,你不能在文本模式下做(例如相对查找),但是我找不到在文本模式下你无法做的任何事情二进制模式 - 即使以例如文本形式读取文件std :: getline()

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

编辑附加信息

这里是什么导致我问:

我有在Windows系统上创建的文件 - 即行结束符是CR LF。

我与std::ifstream使用std::ios::binary标志

我通过文件解析与std::getline打开它,准确地得到我所期望的行为 - 函数getline每次读取一行。

系统:Windows 7专业版

编译:G ++中针对MINGW32

+0

不确定标准库是否执行此操作,但在文本文件的开头可能存在一些文本编码字节和字节顺序掩码。如果在文本模式下打开,标准库是否可以正确解释并跳过它们?但在二进制模式下将它们视为非特殊字节? – leemes

+0

曾经有这样的想法,你会读写“文本文件”平台 - 无法解释。所以你想使用任何适合平台的行分隔符。对于那些使用Windows以外记事本以外的文本编辑器的人,我认为这个想法已经有一天了 - 你只能写LF,并且在任何平台上阅读时都可以接受这两种文件。但即使你接受(不是每个人都会这样做),改变默认值也是不必要的不​​兼容。 –

+0

@SteveJessop:“改变默认是不必要的不​​兼容性”这正是我的问题:是吗?可以编写哪些代码与所有时间传递的隐式':: binary'不兼容? – medivh

那么标准输入默认情况下,在文本模式下打开,这允许使用例如CTRL + Z信号EOF所以不看看为什么你认为除了二进制模式之外,没有任何“需要”将流打开。

你能在文本模式下做什么,你不能在二进制文件中做什么?对于初学者,请阅读 文字。文本模式下自动打开的文件 在内部翻译为'\n'字符,无论系统用于在外部对文件中的行分隔 。即使 底层系统要求文件大小为某个固定大小的倍数,它也可以识别文件的任意结尾。

今天的选择有点复杂,因为您经常必须从不兼容的系统访问文件。如果 在Windows和Unix上都有文件系统,则在Windows下将其作为文本编写为 ,然后在Unix下将其读为文本,然后在 之后您会看到多余的字符。在这种情况下,它可能是 更适合读取和写入二进制文件,并根据您喜欢的任何约定来执行处理自己的行结束 。 同样,如果“文件”实际上是一个套接字,与另一台机器通信 ,则需要按照协议的要求 自己处理行结束符。

+0

“从不兼容的系统访问文件” - 谁进一步通过二进制方式共享该文件。如果文件由内容感知机制(例如SVN)共享,那么该机制可能会为您执行相关转换。 – MSalters

+0

@ MSalters当我说“分享”时,我的意思是“分享”。共享文件系统,安装在几个不同的系统上。这似乎是我工作过的大多数地方(当他们有Windows机器时)通常的情况。 –

+0

我的理解是否正确,然后,我看到的行为只是因为我编译的窗口和使用Windows结束,但会得到不同的行为,如果我(编译为Unix但使用相同的窗口endline),或(使用Unix结束,但仍编译为Windows)? – medivh