使用字符串作为文件容器

时间:2015-01-18 00:27:25

标签: c++ string size filestream

我使用了一个字符串(mystring)来放置文件的内容:

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

这有几个例子,我想知道为什么? (即使是包含像png文件这样的零的文件),我的意思是二进制文件正确保存在硬盘上......

否则,我使用size()方法来确定字符串包含的数据大小,以便上传它,...我知道在一些二进制文件中有零(&#39; \ O&# 39;),我读到这个方法类似于length()所以如果找到&#39; \ 0&#39;它会停止计数。 ?但即使在那种情况下,我的应用程序工作,我的意思是,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);

so size()会返回myifstream.tellg()的值吗?并且直到它找到&#39; \ 0&#39; ??

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

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

2 个答案:

答案 0 :(得分:2)

对于字节流而不是字符串使用std::vector<uint8_t>可能会更好,不是因为字符串不起作用,而是因为从语义上讲,字符串是用于文本字符串的,即你可以推送到{{ 1}}。

答案 1 :(得分:1)

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

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