Записать структуру в файл - PullRequest
0 голосов
/ 20 мая 2019

Я работаю над заданием, строю постоянный индекс дерева b + для файла csv.Я прочитал файл CSV и поместил данные, которые я хочу записать, в файл данных в виде структуры.

deque<employeeShort> employees

struct employeeShort {
    int Emp_ID;
    string firstname;
    string lastname;
    string SSN;
    string username;
    string password;
};

Теперь мне нужно записать всю эту таблицу в файл (обратите внимание, чтооколо 10000 записей).Но, насколько я понимаю, я могу записать в файл только через буфер, который является массивом символов.

Мое текущее решение состоит в том, чтобы перебрать всю деку и добавить в вектор символов, который я затем могу преобразовать в символмассив и использование для записи в файл.

vector<char> bufferVec;


while(!employees.empty()) {
    readCSV::employeeShort tempEmp = employees.front();
    string tempID = to_string(tempEmp.Emp_ID);
    copy(tempID.begin(), tempID.end(), back_inserter(bufferVec));
    copy(tempEmp.firstname.begin(), tempEmp.firstname.end(), back_inserter(bufferVec));
    copy(tempEmp.lastname.begin(), tempEmp.lastname.end(), back_inserter(bufferVec));
    copy(tempEmp.SSN.begin(), tempEmp.SSN.end(), back_inserter(bufferVec));
    copy(tempEmp.username.begin(), tempEmp.username.end(), back_inserter(bufferVec));
    copy(tempEmp.password.begin(), tempEmp.password.end(), back_inserter(bufferVec));

    employees.pop_front();

}

char buffer[bufferVec.size()];
copy(bufferVec.begin(), bufferVec.end(), buffer);

pageFile.global_fs.write(buffer, sizeof(buffer));

Я знаю, что это очень хакерский способ сделать это, и я надеялся, что кто-то может предложить что-то более эффективное.Спасибо.

1 Ответ

0 голосов
/ 20 мая 2019

Если я хорошо понял, вы хотите записать все структуры данных, хранящиеся в deque, в файл.

Для меня вам просто нужно открыть файл с помощью std::ofstream и выполнить итерациюнад вашей декой, чтобы записать его содержимое в файл.


Пример:

C ++ код:

#include <fstream>
#include <iostream>
#include <deque>

struct data
{
    char s1;
    std::string s2;
    int s3;
};

int main()
{
    std::deque<data> data_deque;
    data_deque.push_back(data{'A', "Zero", 0});
    data_deque.push_back(data{'B', "One", 1});
    data_deque.push_back(data{'C', "Two", 2});

    std::string file_path("data.txt"); // The path to the file to be written
    std::ofstream out_s(file_path, std::ofstream::app);
    if(out_s)
    {
        for(const data & d : data_deque)
        {
            out_s << "S1: " << d.s1 << '\n';
            out_s << "S2: " << d.s2 << '\n';
            out_s << "S3: " << d.s3 << '\n';
            out_s << std::endl; // separate each data by a new line;
        }

        out_s.close();
    }
    else
        std::cout << "Could not open file: " << file_path << std::endl;

    return 0;
}

Вывод в data.txt:

S1: AS2: нольS3: 0S1: BS2: одинS3: 1S1: CS2: дваS3: 2

При создании std::ofstream я добавил std::ofstream::app, чтобы не удалять предыдущее содержимое файла, но если вы хотите очистить файл перед записью данных, вам просто нужно удалитьэтот параметр (по умолчанию он очищает предыдущее содержимое файла при открытии).


Надеюсь, это может помочь.

...