C++写入字节向量到文件

4

我有:

typedef unsigned char;
std::vector<byte> data;

我尝试以这种方式保存数据到文件中(但是我遇到了错误):
fstream file(filename,ios::out);
file.write(&data, data.size());

如何处理或转换数据以便将其写入文件。

1
这段代码是错误的 - 它无法编译。 - DarkWanderer
1
data.size是一个问题。它不是函数,所以应该写成data.size() - Dipika
6个回答

9

要将向量存储在文件中,您必须写入向量的内容,而不是向量本身。您可以使用&vector[0]访问原始数据,即第一个元素的地址(假设它至少包含一个元素)。

ofstream outfile(filename, ios::out | ios::binary); 
outfile.write(&data[0], data.size());

这应该在写入时非常有效。 fstream是通用的,如果您要写入,请使用ofstream


3
请注意,使用C++11时,&data[0]可以替换为data.data(),后者看起来更加简洁。 - niklasfi
3
需要一个转换 - istream::write的第一个参数需要是const char*类型,然而在原始代码中,&data[0]unsigned char*类型。 - M.M

5

*语句file.write(&buffer[0],buffer.size())出错:

错误 C2664:'std::basic_ostream<_Elem,_Traits>::write':无法将参数1从“unsigned char *”转换为“const char *”

*在我的编译器(VS2008)中,我没有vector的data()方法。

我认为以下是正确的:

file.write((const char*)&buffer[0],buffer.size());

3
使用方式如下:file.write(reinterpret_cast<const char*>(&myVector[0]), myVector.size()); - Dipika
1
data() 方法只存在于 C++11 中,因此在 VS2008 中它不存在。 - Dipika
如果你要进行类型转换,为什么不转换成错误信息中提到的类型呢?而且,你只是认为它是正确的吗?如果一个答案只是自认为正确但实际上并没有验证,那对于未来的观看者有帮助吗?我并不是想贬低你,只是想改进这个答案。 - Kaz Dragon
@Kaz Dragon:请写出你的答案和我的另一种版本,我会接受它。我已经纠正了我的答案。 - CppMonster
其实,我没有注意到你也是问题的提问者。你可以忽略我说的一半内容。 - Kaz Dragon
在开始时知道你使用的IDE会很有帮助。 - Engineer2021

3

使用vector::data获取指向底层数据的指针:

file.write(data.data(), data.size());

2
使用这种方法,应该指出后一个参数表示要写入的字节数。由于 sizeof(char) == 1,所以这是可以的。对于任何其他数据类型,请使用 file.write((char*) data.data(), data.size() * sizeof(data.front()))。正如 @staticx 指出的那样,在打开 ofstream 时确保添加适当的标志:ofstream file(filename, ios::out | ios::binary); - niklasfi

2
您需要传递第一个元素的地址,而不是向量对象本身的地址。
     &data[0]

注意:在执行此操作之前,请确保向量不为空。

2
很多解决方案只是部分完成(缺少包含和转换),因此让我发布一个完整的工作示例:
#include <vector>
#include <fstream>

int main()
{
    std::vector<std::byte> dataVector(10, std::byte{ 'Z' });

    const std::string filename = "C:\\test_file.txt";

    std::ofstream outfile(filename, std::ios::out | std::ios::binary);
    outfile.write(reinterpret_cast<const char*>(dataVector.data()), dataVector.size());

    return 0;
}

0

我认为 ostream.write (myVector[0], ...) 不会起作用,因为它在读取到向量中也不起作用(我试过了)。 有效的方法是使用 ostream.write(MyVector.data(), ...) 注意:要进行读取,请使用 ifstream.read(const_cast(MyVector.data()), ...)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接