将字符串打印到文件,为啥需要额外的位?

Posted

技术标签:

【中文标题】将字符串打印到文件,为啥需要额外的位?【英文标题】:print string to file , why extra bits?将字符串打印到文件,为什么需要额外的位? 【发布时间】:2013-06-21 09:31:55 【问题描述】:

我正在使用 VisualC++ 2010, 我有一个 9600000 字节的大字符串要打印

当我将它写入文件时,文件大小更大 9 957 891 字节。为什么?

我在调试模式下检查了文件大小,所以我确定它是 9600000

ofstream output_asci("output.bin");
output_asci<<the_string;
output_asci.close();

【问题讨论】:

不知道。文件中有换行符吗?如果是这样,它们将在 Windows 系统上从 '\n' 转换为 '\r','\n',以匹配 Windows 文件中的传统换行符。 这是因为系统添加了一些用户不可见的东西来帮助它理解文件。 @Infested:我不这么认为(除非你指的是与换行符一起组成换行符的回车)。 抱歉,不是在文件中,对吧? @Infested:这在我 27 年的编程生涯中从未见过。文件包含您写给他们的内容。没有其他的。 C 运行时将转换换行符,但如果您将 16 个字节写入文件(没有换行符),则该文件将包含 16 个字节,不多也不少。当然,磁盘上占用的实际空间可能更大,因为大多数文件系统都有一些块大小,它会被四舍五入到[在真正旧的文件系统中,文件中没有字节数,所以文件必须有一个结束标记] 【参考方案1】:

http://www.cplusplus.com/reference/fstream/ofstream/open/

尝试将标志 ios::binary 作为参数添加到 ofstream::open,我认为这会起作用,但我还没有测试过。

【讨论】:

取决于文件应该是“二进制”还是“文本”类型的文件。我试着询问文件中是否有换行符,但还没有回复。如果有换行符,就可以解释文件大小不同的原因。如果该文件是文本文件,那么将其编写为二进制文件只会使其无用(尽管“大小合适”) 用二进制模式写字符串完全没问题,只要字符串有你需要写的所有内容在原始数​​据中(编码设置正确)example 是的,但它不会在其他期望换行符为 CR+LF 的应用程序中作为文本文件“工作”,如果这是最初的意图 [我们仍然不知道那,因为 OP 没有返回“是的,我想要一个文本文件”或“不,我不想要一个文本文件”]。 啊哈!对不起,我误解了,如果默认的操作系统行为不是他想要的,OP 可以自己处理 CR LF 是的,但是如果 OP 想要输出一个 ~9.6MB 的文件,OP 可以在写字板或类似的工具中打开,那么使用文本和常规 C 样式的行尾将是“正确”的做法.我最初的评论很简单,“这实际上可能不是 OP 想要的”。如果它不可读,使其二进制以使其具有正确的大小并没有多大帮助......

以上是关于将字符串打印到文件,为啥需要额外的位?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Xilinx 乘法器 IP 产品位宽有一个额外的位?

UNIX API调用:使用read()函数打开文件并将其打印到屏幕会添加额外的随机字符

为啥 ConfigurationManager.OpenMappedExeConfiguration 文件中没有额外的连接字符串?

为啥我的程序没有将字符从文件输入到二维数组中?

为啥下面的 C++ 代码只打印第一个字符?

netezza nzsql 将查询结果导出到 csv 文件