使用字符串作为文件容器

using a string as a file container

本文关键字:文件 字符串      更新时间:2023-10-16

我用一个字符串(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)将它们复制到字符串中...即使有零,它也总是有效的。

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

您可能最好将std::vector<uint8_t>用于字节流而不是字符串,不是因为字符串不起作用,而是因为在语义上,字符串用于文本字符串,即您可能会推送到cout的东西。

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

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