2016-03-22 6 views
-3

Я работаю над проектом с файлами. Часть 1 проекта заключалась в том, чтобы добавлять/удалять и сортировать некоторые obejcts в текстовый файл, поэтому я уже реализовал эти функции. Теперь часть 2 также поддерживает двоичные файлы - средства для добавления/удаления и сортировки двоичных файлов. Мое мышление состоит в том, чтобы иметь некоторую «магическую функцию», которая преобразует двоичный файл в текстовый файл, чем использовать мою функцию выше (потому что они поддерживают только текстовые файлы), делать любые запросы - добавлять \ удалять obejcts; Затем преобразовать его с помощью «волшебной функции» из текстового файла в двоичный файл. Каждая строка внутри текстового файла представляет собой объект, называемый «кандидат». Он имеет следующие поля: string id, имя строки, имя строки, строка участника , например, 1-я строка выглядит так: 201, Donald, Trump, Republican Любое предложение, где найти эту «магическую функцию»? Спасибо в продвинутом режиме.Двоичный файл в текстовый файл и текстовый файл в двоичный файл

+0

Поиск в Google для «кодировки base64». –

+0

Я не думаю, что это было бы в духе требования. Причина использования двоичных файлов заключается в том, что они упрощают добавление и удаление объектов. –

+0

@MartinBroadhurst, так что вы предлагаете? –

ответ

0

Существует не общий способ преобразования текста и двоичных данных, поскольку вам необходимо знать, что данные означает, и это неясно, особенно в случае двоичных данных.

Ваш класс уже знает, что означает ваши данные, поэтому только ваш класс может надежно читать себя как текст и записывать себя как двоичный, или наоборот. Но как только вы выполнили чтение и запись в текстовом или двоичном виде в своем классе, необходимость в преобразовании уходит.

Я уверен, что выполнение чтения и записи в виде текста или двоичного кода в вашем классе - это то, что вас просили сделать в первую очередь.

Ваш класс содержит только std::string s. Там нет стандартного способа записи их в качестве двоичного, но один пути, чтобы сначала написать длину, а затем записать содержание:

void WriteString(const std::string& s, std::ofstream& os) 
{ 
    size_t size = s.size(); 
    os.write(reinterpret_cast<char*>(&size), sizeof(size_t)); 
    os.write(s.c_str(), size); 
} 

Обратный процесс чтения означает первое чтение длины, а затем содержимое. Вы не можете прочитать содержимое прямо в std::string, потому что его буфер памяти не гарантируется быть смежными, так что вам нужно использовать std::vector<char> в качестве посредника:

std::string ReadString(std::ifstream& is) 
{ 
    size_t size; 
    is.read(reinterpret_cast<char*>(&size), sizeof(size_t)); 
    std::vector<char> buffer(size); 
    is.read(&buffer[0], size); 
    return std::string(&buffer[0], size); 
} 

Теперь, чтобы писать или читать ваши Candidate объекты, как двоичный, вам просто нужно использовать эти две функции для записи или чтения полей по одному:

void Candidate::Write(std::ofstream& os) const 
{ 
    WriteString(id, os); 
    WriteString(name, os); 
    WriteString(last_name, os); 
    WriteString(party, os); 
} 

void Candidate::Read(std::ifstream& is) 
{ 
    id = ReadString(is); 
    name = ReadString(is); 
    last_name = ReadString(is); 
    party = ReadString(is); 
} 

Вам понадобится конструктор по умолчанию для Candidate класса, чтобы создать «пустые» объекты для чтения, и вы будете вероятно, хотят написать число кандидатов в верхней части файл, чтобы вы знали, сколько нужно прочитать.

Существует много больше для двоичных файлов, чем это - вы, вероятно, захотите реализовать случайный доступ, чтобы действительно получить преимущества - но это должно вас начать.

Смежные вопросы