为什么我打开一个没有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
那么标准输入默认情况下,在文本模式下打开,这允许使用例如CTRL + Z信号EOF所以不看看为什么你认为除了二进制模式之外,没有任何“需要”将流打开。
你能在文本模式下做什么,你不能在二进制文件中做什么?对于初学者,请阅读 文字。文本模式下自动打开的文件 在内部翻译为'\n'
字符,无论系统用于在外部对文件中的行分隔 。即使 底层系统要求文件大小为某个固定大小的倍数,它也可以识别文件的任意结尾。
今天的选择有点复杂,因为您经常必须从不兼容的系统访问文件。如果 在Windows和Unix上都有文件系统,则在Windows下将其作为文本编写为 ,然后在Unix下将其读为文本,然后在 之后您会看到多余的字符。在这种情况下,它可能是 更适合读取和写入二进制文件,并根据您喜欢的任何约定来执行处理自己的行结束 。 同样,如果“文件”实际上是一个套接字,与另一台机器通信 ,则需要按照协议的要求 自己处理行结束符。
不确定标准库是否执行此操作,但在文本文件的开头可能存在一些文本编码字节和字节顺序掩码。如果在文本模式下打开,标准库是否可以正确解释并跳过它们?但在二进制模式下将它们视为非特殊字节? – leemes
曾经有这样的想法,你会读写“文本文件”平台 - 无法解释。所以你想使用任何适合平台的行分隔符。对于那些使用Windows以外记事本以外的文本编辑器的人,我认为这个想法已经有一天了 - 你只能写LF,并且在任何平台上阅读时都可以接受这两种文件。但即使你接受(不是每个人都会这样做),改变默认值也是不必要的不兼容。 –
@SteveJessop:“改变默认是不必要的不兼容性”这正是我的问题:是吗?可以编写哪些代码与所有时间传递的隐式':: binary'不兼容? – medivh