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

时间:2013-12-20 13:40:26

标签: c++ fstream

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

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

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

编辑其他信息

这是让我问的原因:

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

我使用std::ifstream标记

打开std::ios::binary

我使用std::getline解析文件并获得我期望的行为 - getline一次读取一行。

系统:Windows 7 Pro

编译器:用于MINGW32的g ++

2 个答案:

答案 0 :(得分:7)

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

今天的选择有点复杂,因为你 通常必须从不兼容的系统访问文件。如果 你有一个安装在Windows和Unix上的文件系统,写 它作为Windows下的文本,然后在Unix下将其作为文本读取 你会看到额外的角色。在这种情况下,它可能是 最好是读写二进制文件,并做行结束 根据您喜欢的任何惯例处理自己。 同样,如果“文件”实际上是一个套接字,则进行通信 与另一台机器,你会想要以二进制打开它,和 根据要求自己处理线路结束 协议。

答案 1 :(得分:2)

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