如何在c中正确地将向量写入二进制文件?

新手上路,请多包涵

首先对不起我的英语不好。我刚加入这个论坛并搜索如何正确地将向量写入二进制文件。我刚从这个论坛得到一个这样的答案(我已经修改了一点):

 #include <iostream>
#include <string.h>
#include <vector>
#include <fstream>

using namespace std;

class Student
{
public:
char m_name[30];
int m_score;

public:
Student()
{

}
Student(const char name[], const int &score)
:m_score(score)
{
    strcpy(m_name, name);
}
void print() const
{
    cout.setf(ios::left);
    cout.width(20);
    cout << m_name << " " << m_score << endl;
}
};

int main()
{
    vector<Student> student;
    student.push_back(Student("Alex",19));
    student.push_back(Student("Maria",20));
    student.push_back(Student("muhamed",20));
    student.push_back(Student("Jeniffer",20));
    student.push_back(Student("Alex",20));
    student.push_back(Student("Maria",21));

    ofstream fout("data.dat", ios::out | ios::binary);
    fout.write((char*) &student, sizeof(student));
    fout.close();

    vector<Student> student2;

    ifstream fin("data.dat", ios::in | ios::binary);
    fin.seekg(0, ifstream::end);
    int size = fin.tellg() / sizeof (student2);
    student2.resize(size);
    fin.seekg(0, ifstream::beg);
    fin.read((char*)&student2, sizeof(student2));
    vector<Student>::const_iterator itr = student2.begin();
    while(itr != student2.end())
    {
            itr->print();
            ++itr;
    }
    fin.close();
    return 0;
}

但是当我运行它时。在我的 linux mint 上,我得到了这个结果:

 Alex                 19
Maria                20
muhamed              20
Jeniffer             20
Alex                 20
Maria                21
*** glibc detected *** ./from vector to binary: corrupted double-linked list: 0x0000000000633030 ***

我是 C++ 新手。有人请帮助我,过去两周一直陷入这个问题。提前感谢您的回答。

原文由 dchochan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 622
2 个回答

您正在写入文件矢量结构,而不是其数据缓冲区。尝试将写入程序更改为:

  ofstream fout("data.dat", ios::out | ios::binary);
 fout.write((char*)&student[0], student.size() * sizeof(Student));
 fout.close();

而不是从文件大小计算向量的大小,最好先写向量大小(对象数)。在这种情况下,您可以将其他数据写入同一文件。

  size_t size = student.size();
 fout.write((char*)&size, sizeof(size));

原文由 ocelot 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

 strm.write(reinterpret_cast<const char*>(&vec[0]), vec.size()*sizeof(T));

从文件中读取向量时也是如此;元素计数是文件总大小除以一个元素的大小(假设您只在文件中存储一种类型的 POD):

 const size_t count = filesize / sizeof(T);
std::vector<T> vec(count);
strm.read(reinterpret_cast<char*>(&vec[0]), count*sizeof(T));

这仅适用于您可以根据文件大小计算元素数量(如果您只存储一种类型的 POD 或所有向量包含相同数量的元素)。如果您有具有不同 POD 和不同长度的向量,则必须在写入原始数据之前将向量中的元素数写入文件。

此外,当您在不同系统之间以二进制形式传输数字类型时,请注意 字节顺序

原文由 Anonymous Coward 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题