【问题标题】:How to change stream from text mode to binary in C++?如何在 C++ 中将流从文本模式更改为二进制?
【发布时间】:2014-08-15 14:40:28
【问题描述】:

在我正在制作的游戏中,我需要从文件中读取地图。假设一开始的一些数据是用字符写的,但是瓦片图是用二进制写的,我会以文本模式打开文件,然后在到达瓦片数据时将其切换到二进制模式。

是否有一种简单或标准的方法可以将 ifstream 从文本模式更改为二进制模式,同时在文件中保持相同的位置? 这也适用于写入部分,我需要开始使用字符写入文件,然后更改为二进制模式。

编辑:我正在使用文本模式使其可读并读取未知大小的字符串。例如这一行:

map-name=TestMap

我会读这篇文章

getline( mapFile, attribute, '=' );
getline( mapFile, mapName, '\n' );

如果没有换行符,我将如何以二进制模式阅读?

【问题讨论】:

  • 您能否举三个例子:如何将文件打开为二进制文件、如何将其打开为文本文件以及混合模式文件的外观?
  • 混合文件是个坏主意...
  • 我不确定您是否了解流的文本模式和二进制模式之间的区别。在您的情况下,您应该始终使用二进制模式 - 您可以以二进制模式将字符写入流而不会出现问题。
  • 以二进制模式打开就可以很好地读写文本。它们之间的唯一区别是换行符会发生什么(这意味着在文本模式下搜索是不可靠的)。
  • open( filename ) 将以文本模式打开, open( filename, ios::binary ) 将以二进制模式打开,对。我不会只是从一个更改为另一个...那是一个愚蠢的问题..

标签: c++ text stream binary ifstream


【解决方案1】:

模式是文件打开时建立的,不能 后来改了。如果文件中有任何二进制数据,你 必须使用二进制模式。但问题出在哪里?你可以阅读 二进制模式的文本;行尾可能看起来有点奇怪 (但如果您也以二进制模式编写它,则不是),否则, 只要二进制数据实际应该没有问题 是文本。

【讨论】:

  • 所以如果我在二进制模式下写一个换行符,当我接下来读它时它会是一个换行符而不是一个 CR/LF 组合?如果是这样,我可以一直使用二进制模式。
  • @aslg 最后,字符也是二进制数据。在文本模式下,某些字符(如\n)会被特殊处理。在二进制中,没有。 (理论上,如果您读写二进制文件,文件末尾可能会出现额外的零。实际上,这种情况已经很久了。)
  • “但问题出在哪里?” - std::cin 以文本模式打开。 C++ 似乎没有规定以二进制模式将cin 作为流读取。我想一旦我的main 开始执行,我可能会通过将其切换为二进制来结束。另请参阅Read binary data from std::cin
【解决方案2】:

如果您也负责编写文件,那么最简单(也许也是最明智)的解决方案可能是编写两个文件。

文本中的一个,用于您希望人类可读的文本。

第二个是二进制的,用于地图之类的东西。事实上,这样一来,您就可以为每个地图创建一个二进制地图文件。

【讨论】:

  • 我想我可以将地图分成两个文件。这听起来确实是个好主意。我可以将元数据作为文本放在一个文件中,将图块作为二进制文件放在另一个文件中。虽然我还有其他东西要添加,比如 NPC、敌人遭遇……我想知道我是否应该为每张地图添加不同的文件而不是单个文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2022-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2013-09-15
  • 1970-01-01
相关资源
最近更新 更多