【问题标题】:Writing a vector to a file and reading it back将向量写入文件并读回
【发布时间】:2012-11-24 23:31:56
【问题描述】:

我正在尝试做一些快速而肮脏的矢量序列化,但它没有按预期工作。尝试从文件中读取向量时,问题是段错误。我将文件偏移量和矢量大小存储在标题中。代码如下:

// writing
std::vector<size_t> index;

header.offset = ofs.tellp();
header.size = sizeof(index);
ofs.write((char *) &index[0], sizeof(index)); // pretty bad right, but seems to work   

// reading
std::vector<size_t> index;
index.resize(header.numElements)

ifs.seekg(header.offset);
// segfault incoming
ifs.read((char *) &index[0], header.size);

说实话,如果这行得通,我会感到惊讶,但我不确定什么是实现我想要的正确方法。我宁愿远离 boost,但我已经在使用 Qt,所以如果 QVector 或 QByteArray 能以某种方式帮助我,我可以使用它们。

【问题讨论】:

    标签: c++ qt stl stdvector


    【解决方案1】:

    sizeof 不会像您认为的 vector 那样做。如果要获取向量分配内存的大小(以字节为单位),可以执行index.size() * sizeof(size_t)index.size() 是向量中的元素个数,sizeof(size_t) 是向量中一个元素的大小。

    更正后的代码更像(修剪多余的东西):

    // writing...
    std::vector<size_t> index;
    
    size_t numElements = index.size();
    size_t numBytes = numElements * sizeof(size_t); // get the size in bytes
    ofs.write((char *) &index[0], numBytes);
    
    // reading...
    std::vector<size_t> index;
    index.resize(numElements);
    
    ifs.read((char *) &index[0], numBytes); // again, numBytes is numElements * sizeof(size_t)
    

    至于sizeof(index) 的真正作用,它返回实际矢量对象的大小。向量存储的元素与其大小是分开的。例如:

    int* array = new int[500];
    // sizeof(array) is the size of the pointer, which is likely 4 or 8 bytes if you're on 32 or 64 bit system
    

    【讨论】:

    • 没错,+1,我应该检查一下。但是问题仍然是读取向量的行。
    • @Marian:如果 a) header.numElements 是正确的,并且 b) 如果 header.size 是正确的,它不应该失败。如果它仍然崩溃,则其中之一可能是错误的。有什么价值观?
    • 我已经用 cout 检查了它们是否设置正确(例如 320 表示 80 元素数组)。我会尝试将它作为单独的程序运行,看看是否可行。
    • 好的,现在可以了。不确定问题出在哪里。只是做了一些小的重构,不知何故问题就消失了。感谢您的帮助。
    【解决方案2】:

    我会尝试使用指向向量的指针。您正在尝试使用对数据类型的引用。如果你的 C++ 试图是类型安全的,它可能不起作用

    【讨论】:

      猜你喜欢
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多