C++ 将字符串写入文件 = 额外字节

Posted

技术标签:

【中文标题】C++ 将字符串写入文件 = 额外字节【英文标题】:C++ writing string to file = extra bytes 【发布时间】:2009-10-20 04:00:34 【问题描述】:

我正在使用 c++ 查看 256 个计数并将 ASCII 代表写入文件。

如果我使用生成256个字符串的方法然后将该字符串写入文件,文件重258字节。

string fileString = "";

//using the counter to attach the ASCII count to the string.
for(int i = 0; i <= 256; i++)

    fileString += i;


file << fileString;

如果我使用循环写入文件的方法,文件正好是256字节。

//using the counter to attach the ASCII count to the string.
for(int i = 0; i <= 256; i++)

    file << (char)i;

字符串是怎么回事,字符串中的哪些额外信息被写入文件?

【问题讨论】:

您的循环中有一个错误。它应该是 != 256 或 一切都可以编译和工作。使用强制转换的最后一种方法使文件成为完美的 256 字节。哪个文件应该是正确的? 您仍然有一个错误。没有第 256 个 ASCII 字符,只有 0-255。另外,Kay,+= 会自动执行转换,在 256 处返回到 0。 这样可以将文件大小降低到 257 字节。这对于包含 256 个字符的文件是否正常? 也许作为文本,作为二进制应该完全匹配。 【参考方案1】:

这两个都创建一个 256 字节的文件:

#include <fstream>
#include <string>

int main(void)

    std::ofstream file("output.txt", std::ios_base::binary);
    std::string fileString;

    for(int i = 0; i < 256; i++)
    
        fileString += static_cast<char>(i);
    

    file << fileString;

还有:

#include <fstream>
#include <string>

int main(void)

    std::ofstream file("output.txt", std::ios_base::binary);
    std::string fileString;

    for (int i = 0; i < 256; ++i)
    
        file << static_cast<char>(i);
    

    file.close();

请注意,在您遇到非一错误之前,因为没有第 256 个 ASCII 字符,只有 0-255。打印时它将截断为字符。另外,更喜欢static_cast

如果您不以二进制形式打开它们,它将在末尾附加一个换行符。我的标准在输出领域很弱,但我知道文本文件的末尾总是有一个换行符,它会为你插入这个。我认为这是实现定义的,到目前为止,我在标准中只能找到“析构函数可以执行额外的实现定义的操作”。

当然,以二进制打开会删除所有条形,让您控制文件的每个细节。


关于 Alterlife 的关注,你可以在字符串中存储 0,但 C 风格的字符串以 0 结尾。因此:

#include <cstring>
#include <iostream>
#include <string>

int main(void)

    std::string result;

    result = "apple";
    result += static_cast<char>(0);
    result += "pear";

    std::cout << result.size() << " vs "
        << std::strlen(result.c_str()) << std::endl;

将打印两种不同的长度:一种是计数的,一种是空终止的。

【讨论】:

i 我这样做了,我的文本文件达到了 257 字节。知道那个额外的字节是做什么用的吗? visual studio,空 c++ 项目,windows vista,不确定二进制模式。我要试试。 好的。二进制使您可以逐字节地完全控制文件。否则,在文本模式下,编译器似乎可以添加任何它想要的东西。如果你真的需要逐字节控制,无论如何你都想做二进制。 您当然可以通过以二进制模式打开文件然后检查每个字节来检查这一点。最后一个是'\n'【参考方案2】:

我对 c++ 不太熟悉,但您是否尝试使用 null 或 '/0' 初始化文件字符串变量?也许然后它会给出256字节的文件..

是的,循环应该是

PS:我真的不确定,但我想它值得一试..

【讨论】:

以上是关于C++ 将字符串写入文件 = 额外字节的主要内容,如果未能解决你的问题,请参考以下文章

C ++将字节写入文件

在 C++ 中写入整数并从二进制文件中读取它们:字节数 mismaych

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

C++ 如何将一个文件里的数据写入到另一个文件里?

c++文件怎么从文件中读出和写入字符串?

C语言二进制流写入文件