Запись в переменную, не зная общего размера заранее

0

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

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

Можете ли вы предложить мне структуру данных для этого случая?

  • 1
    if(!I_have_memory_constraints())
  • 0
    std::vector<std::uint8_t> или std::string
Показать ещё 1 комментарий
Теги:
data-structures

2 ответа

1

Да точно.
В буфере данных есть два указателя. Пометка и указатель 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);
1

Просто чтобы исправить @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();

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

  • 0
    могу ли я сохранить смещение позиции, вернуться к ней и отредактировать данные в этой позиции?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню