Мне нужно изменить существующую функцию, которая создает файл в соответствии с конфигурацией системы. Общий размер созданного файла неизвестен заранее. Таким образом, исходная функция просто создает файл и сбрасывает в него все. Он даже сохраняет некоторые смещения в памяти и обновляет файл во время процесса.
Мне не разрешено создавать файл на диске. Мне нужно держать все в одной переменной. Тем не менее, я не знаю общий размер заранее.
Можете ли вы предложить мне структуру данных для этого случая?
Да точно.
В буфере данных есть два указателя. Пометка и указатель get. Поэтому самый простой способ объяснить это - сказать, что надел для написания, а get - для чтения.
Таким образом, поиск позиции курсора может быть выполнен следующим образом:
Попробуйте что-то вроде этого:
//Get the offset where the write pointer is..
std::streamoff offset = buffer.tellp();
//Write 'dummy' value
buffer.write(reinterpret_cast<char*>(&integer), sizeof(int));
.
.
.
(do other writing)
.
.
.
//Scroll to offset (from start)
buffer.seekp(offset);
//Write real value
buffer.write(reinterpret_cast<char*>(&integer), sizeof(int));
Хорошо, так что если вы хотите прокрутить до смещения с самого начала. Если вы хотите просмотреть текущую позицию, посмотрите на такие вещи, как:
buffer.seekp(offset, std::ios_base::cur);
Просто чтобы исправить @Raxvan ответ. Вы можете записать двоичный код в std :: stringstream. Например, если вы хотите читать и писать в stringstream, объявите его как:
std::stringstream buffer(std::iostream::in | std::iostream::out | std::iostream::binary);
Если вы хотите записать ему двоичные данные:
int integer = 1234;
buffer.write(reinterpret_cast<char*>(&integer), sizeof(int));
Если вы хотите прочитать его позже:
int integer = 0;
buffer.read(reinterpret_cast<char*>(&integer), sizeof(int));
Вам не нужно указывать длину заранее. Если вам понадобится длина после этого, вы можете использовать что-то вроде:
buffer.str().size();
Надеюсь это поможет..
if(!I_have_memory_constraints())
std::vector<std::uint8_t>
илиstd::string