使用C ++迭代在二进制文件中读写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C ++迭代在二进制文件中读写相关的知识,希望对你有一定的参考价值。

我正在做一个涉及系统的功课,该系统将结构保存在二进制文件上,这是必要的(?)迭代的使用。

我写作时遇到问题(不确定是否正确):

void InserirDados () {

    //var created to acknowledge the quantity of items that will be described
    int quantidade;

    cout << "Quantos personagens voce pretende inserir nesta sessao?" << endl;
    cin >> quantidade;

    //allocating memory like it's asked by the teacher
    PersonagemDesenho* objPersonagem = new PersonagemDesenho[quantidade];

    //declaring the flow of data
    ofstream arquivo ("personagens.dat", ios::binary);

    //flush buffer
    cin.ignore ();

    cout << "(A utilizacao de espacos e' permitida para todos os itens a seguir)" << endl;

    //describing items
    for (int i = 0; i < quantidade; i++) {
        cout << " - PERSONAGEM NUMERO: " << i + 1 << endl;

        cout << "Digite o nome do personagem a ser inserido" << endl;
        //getline for getting more than 1 word
        getline(cin, objPersonagem[i].nomePersonagem);

        cout << "Digite o nome do criador do personagem" << endl;
        getline(cin, objPersonagem[i].nomeCriador);

        //writing code
        arquivo.write(reinterpret_cast<const char*> (&objPersonagem[i]), sizeof(PersonagemDesenho));
        }
    cout << "As informacoes serao salvas no arquivo "personagens.dat"" << endl;
    //closing file
    arquivo.close();
}

和阅读数据:

void ListaDados () {

    ifstream arquivo ("personagens.dat", ios::binary);
    int i = 0;

    while (???) {
        arquivo.read(reinterpret_cast<const char*> (&objPersonagens[i]) sizeof(PersonagemDesenho))
        i++;
    }
}
答案

从你使用std::getline()可以清楚地看出,nomePersonagemnomeCriadorstd::string值。 std::string是一种动态类型(它包含指向存储在别处的数据的指针)。当它包含动态数据时,您不能按原样编写/读取结构。您可以编写/读取指针本身,而不是指向的数据。

该问题的解决方案要求在写入时将数据序列化为更平坦的格式,并在读取时对数据进行反序列化。

尝试更像这样的东西:

void writeSizeT(ostream &out, size_t value) {
    out.write(reinterpret_cast<char*>(&value), sizeof(value));
}

void writeString(ostream &out, const string &value) {
    size_t len = value.size();
    writeSizeT(out, len);
    out.write(s.c_str(), len);
}

void InserirDados () {
    //var created to acknowledge the quantity of items that will be described
    int quantidade;

    cout << "Quantos personagens voce pretende inserir nesta sessao?" << endl;
    cin >> quantidade;

    //allocating memory like it's asked by the teacher
    PersonagemDesenho* objPersonagem = new PersonagemDesenho[quantidade];

    //declaring the flow of data
    ofstream arquivo ("personagens.dat", ios::binary);

    writeSizeT(arquivo, quantidade);

    //flush buffer
    cin.ignore ();

    cout << "(A utilizacao de espacos e' permitida para todos os itens a seguir)" << endl;

    //describing items
    for (int i = 0; i < quantidade; i++) {
        cout << " - PERSONAGEM NUMERO: " << i + 1 << endl;

        //getline for getting more than 1 word
        cout << "Digite o nome do personagem a ser inserido" << endl;
        getline(cin, objPersonagem[i].nomePersonagem);
        cout << "Digite o nome do criador do personagem" << endl;
        getline(cin, objPersonagem[i].nomeCriador);

        //writing code
        writeString(arquivo, objPersonagem[i].nomePersonagem);
        writeString(arquivo, objPersonagem[i].nomeCriador);
    }

    cout << "As informacoes serao salvas no arquivo "personagens.dat"" << endl;

    //closing file
    arquivo.close();

    // freeing memory
    delete[] objPersonagem;
}

size_t readSizeT(istream &in) {
    size_t value;
    in.read(reinterpret_cast<char*>(&value), sizeof(value));
    return value;
}

string readString(istream &in) {
    string value;
    size_t len = readSizeT(in);
    if (len > 0) {
        value.resize(len);  
        in.read(&s[0], len);
    }
    return value;
}

void ListaDados () {
    ifstream arquivo ("personagens.dat", ios::binary);

    size_t quantidade = readSizeT(arquivo);

    //allocating memory like it's asked by the teacher
    PersonagemDesenho* objPersonagem = new PersonagemDesenho[quantidade];

    for(size_t i = 0; i < quantidade; ++i) {
        //reading code
        objPersonagem[i].nomePersonagem = readString(arquivo);
        objPersonagem[i].nomeCriador = readString(arquivo);
    }

    // freeing memory
    delete[] objPersonagem;

    //closing file
    arquivo.close();
}

以上是关于使用C ++迭代在二进制文件中读写的主要内容,如果未能解决你的问题,请参考以下文章

使用 webdav 在节点 js 中迭代 createreadstream 下载空文件

是否可以在 C 中使用带有 char 迭代器的 FOR 循环?

在 C++11 中累积从文件中读取数据的整数

vc++ 中动态数组 ventor 的操作问题

如何在Django视图中使用for循环返回每次迭代[关闭]

如何使用 html 文件在 django 中显示 ChoiceField?