如何在C++中将流从文本模式切换为二进制模式?

3
在我正在制作的游戏中,我需要从文件中读取一张地图。假设一些数据在开头是用字符写的,但瓦片地图是用二进制写的,我会先以文本模式打开文件,然后在到达瓦片数据时将其切换到二进制模式。
有没有一种简单或标准的方法可以在保持文件位置不变的情况下将 ifstream 从文本模式更改为二进制模式?这也适用于写入部分,我需要先使用字符开始写入文件,然后切换到二进制模式。
编辑:我使用文本模式使之可读,并读取未知大小的字符串,例如以下行:
map-name=TestMap

我会用中文阅读这篇文章

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

如果没有换行符,我该如何以二进制模式读取这个内容?

你能举三个例子吗?如何以二进制方式打开文件,如何以文本形式打开文件,混合模式文件会是什么样子? - Johannes
2
混合文件是一个非常糟糕的想法... - Deduplicator
2
我不确定您是否理解流的文本模式和二进制模式之间的区别。在您的情况下,您应该始终使用二进制模式 - 您可以在二进制模式下轻松地向流中写入字符。 - Wojtek Surowka
1
如果您以二进制模式打开,那么您可以完美地读写文本。它们之间唯一的区别在于换行符的处理方式(这意味着在文本模式下进行查找是不可靠的)。 - molbdnilo
@MooingDuck 当然可以。实际上,如果您需要控制格式(比如因为它需要特定类型的行结尾),即使格式是100%文本,您也必须使用二进制。我只是在回应评论中指出行结尾不是唯一的区别。 - James Kanze
显示剩余7条评论
2个回答

3

在打开文件时,模式就已确定,无法更改。如果文件中包含任何二进制数据,则必须使用二进制模式。但是问题在哪里?您可以在二进制模式下阅读文本;行结束可能会看起来有些奇怪(但如果还以二进制模式写入它,则不会出现此问题),但是只要二进制数据实际上是文本,就应该没有问题。


那么,如果我在二进制模式下写入一个换行符,当我下次读取它时,它将是一个换行符而不是CR/LF组合吗?如果是这样,我可以一直使用二进制模式。 - aslg
最终,字符也是二进制数据。在文本模式下,某些字符(如\n)会被特殊处理。但在二进制模式下则不会。(理论上,如果您读写二进制文件,可能会在文件末尾多出一些零。但实际上,这种情况已经很久没有发生了。) - James Kanze
“但问题出在哪里呢?” - std::cin 以文本模式打开。C++似乎没有提供以二进制模式读取cin流的方法。我想在main开始执行后将其切换到二进制模式来解决这个问题。另请参见从std :: cin读取二进制数据 - jww

1
如果你负责编写文件,最简单(也许是最明智的)解决方案可能是编写两个文件。
一个文件用于文本,以便使其易于人类阅读。
第二个文件则为二进制格式,用于地图等内容。实际上,这样你可以为每个地图拥有一个二进制地图文件。

我想我可以把地图分成两个文件...这听起来是个好主意。我可以把元数据作为文本放在一个文件中,把瓦片作为二进制放在另一个文件中。虽然我还有其他要添加的东西,比如NPC、敌人遭遇等等...我不知道是否应该为每个地图都有各自的文件,而不是一个单一的文件。 - aslg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接