【问题标题】:using a string as a file container使用字符串作为文件容器
【发布时间】:2015-01-18 00:27:24
【问题描述】:

我用一个字符串(mystring)把文件的内容放在上面:

std::ofstream fs("C:\\example.mp4",std::ios::binary);
fs << mystring;
fs.close();

这适用于几个例子,我想知道为什么? (即使文件包含零,例如 png 文件),我的意思是二进制文件已正确保存在 HDD 上...

否则,我使用 size() 方法来确定字符串包含的数据的大小以便上传,...我知道在某些二进制文件中有零('\O'),我读到这个方法类似于 length() 所以如果它找到一个 '\0' 就会停止计数?但即使在那种情况下,我的应用程序也能正常工作,我的意思是,size() 给了我数据(二进制文件)的真实大小,对于这种情况,我想准确地说我使用了这种类型的构造:

//...
std::ifstream::pos_type fileSize = ifs.tellg();
std::vector<char> bytes(fileSize);
//...
myifstream.read(&bytes[0], fileSize);
file_content = std::string(&bytes[0], fileSize);

所以 size() 将返回 myifstream.tellg() 的值?直到找到 '\0' 才算数??

在另一种情况下,服务器向我发送数据 (char*),我使用 append(data,size) 将它们复制到字符串中......即使有零,它也总是有效......

我想确保使用字符串对象来操作文件内容是安全的。 (文件流和大小())

【问题讨论】:

  • 您的意思可能是fs &gt;&gt; mystring; ?还是您将string 转储到文件中?您的问题不清楚。
  • Diego 谢谢,@vsoftco 字符串已经包含我从 HTTP 服务器接收到的数据,我想把这些数据放在一个文件中,数据可以是任何东西,例如 PNG 文件肯定包含零,无论如何我的代码工作,我的问题的目的,我想知道事情是如何工作的,为什么 fs

标签: c++ string size filestream


【解决方案1】:

你最好使用std::vector&lt;uint8_t&gt; 作为字节流而不是字符串,不是因为字符串不起作用,而是因为从语义上讲,字符串是用于文本字符串的,即你可以推送到cout 的东西。

【讨论】:

  • 完全正确 - 将 u8 向量用于二进制数据更适合避免使用 std::string 时出现的空终止符等问题。
【解决方案2】:

要回答您的第一个问题,string 的基础数据类型只是 char 的数组,因此读取没有可打印字符的数据仍然有效,但如果您尝试打印它会(很可能)是胡言乱语。据我所知,一次读取和重新打印一个字节的文件并不是未定义的行为,但如果我错了,有人可以纠正我。

至于处理空值,链接的问题回答了这个问题,但基本上string 无论如何都会跟踪它的大小,所以没有理由强迫它们以空字符结尾。

【讨论】:

    猜你喜欢
    • 2019-08-14
    • 1970-01-01
    • 2015-01-12
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2016-06-02
    • 2023-03-06
    相关资源
    最近更新 更多