我已经读过,getline
表现为未格式化的输入函数。我相信应该允许它在二进制文件上使用。举例来说,我已经这样做了:
ofstream ouput("foo.txt", ios_base::binary);
const auto foo = "lorem ipsum";
output.write(foo, strlen(foo) + 1);
output.close();
ifstream input("foo.txt", ios_base::binary);
string bar;
getline(input, bar, '\0');
那是违反任何规则吗?看来工作正常,我认为我传统上只是通过写大小然后写数组来处理数组。
不,这没有违反我所看到的任何规则。
是的,写一个带有前缀大小的数组比较常见,但是使用定界符标记结尾也可以很好地工作。最大的区别是(与文本文件一样)您必须通读数据才能找到下一个项目。使用带前缀的尺寸,您可以查看尺寸,如果不需要当前尺寸,则直接跳到下一个尺寸。当然,您还需要确保如果要使用某些内容标记字段的结尾,则该字段永远不会出现在字段内部(或者想出某种方法来检测字段何时在字段内部,以便您可以阅读其余部分则视情况而定)。
根据情况,这可能意味着(例如)使用Unicode文本。这为您提供了很多选项,可用于文本内无法出现的值(因为它们不是合法的Unicode)。另一方面,这也意味着您的“二进制”文件实际上是一个文本文件,并且必须遵循一些基本的文本文件规则才有意义。
哪个更好,取决于您想要读取文件的随机片段而不是从头到尾进行遍历的可能性,以及查找唯一定界符的难度(如果有),以及是否只有一个,使分隔符从字段内部的数据可识别的复杂性。如果仅按顺序写入数据才有意义,那么不必按顺序读取数据就不会造成真正的问题。如果您可以有意义地阅读各个部分,那么能够做得更多可能会很有用。
最后,归结为一个问题,即您想要从文件中获取什么是“二进制”,在典型情况下,所有“二进制”实际上意味着可以从换行符转换的行标记的末尾(例如)回车/换行对的字符将不是。取决于您使用的操作系统,它可能甚至没有太大意义,例如,在Linux上,二进制和文本模式之间通常根本没有区别。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句