Сброс std::unique_ptr содержимого в файл

#c

#c

Вопрос:

Для отладки nncase и просмотра его в действии мне нравится дамп переменной main_men_ , объявленной здесь, например:

 main_mem_.reset(new (std::nothrow) uint8_t[model_header_->main_mem]);
 

будет сбрасываться в файл каждый раз, когда мы пересекаем здесь.

Я вижу, что они обращаются к объекту здесь, как:

 base = (uintptr_t)main_mem_.get();
 

Я попытался сбросить содержимое с помощью этих строк:

             std::ofstream myfile;
            myfile.open("infer-dbg/"   std::to_string(node_id)   " "   node_opcode_names(header.opcode).data());
            for(int i = 0; i < model_header_->main_mem*8; i   )
            {

               myfile << *((uint8_t*)main_mem_.get() i);
            }
            opCount  ;
            myfile.close();
 

но это всегда дает мне один и тот же файл, и я вижу, что mem изменен.

Как может выглядеть идеоматический способ C для сброса этой переменной?

Комментарии:

1. Почему вы не используете std::vector<uint8_t> ? Это практически a std::unique_ptr<uint8_t[]> с большим количеством дополнений

2. Не имеет отношения к вашей проблеме, но в чем причина использования std::unique_ptr<uint8_t[]> вместо std::vector<uint8_t> или, возможно, даже простого std::string ?

3. Если main_mem_ указывает на model_header_->main_mem байты памяти, почему вы model_header_->main_mem * 8 повторяете цикл? Это выйдет за пределы выделенной памяти.

4. Вы правы. * 8 неверно.

Ответ №1:

Я считаю, что вам нужен std::basic_ostream::write:

 myfile.write(reinterpret_cast<const char*>(main_mem_.get()), model_header_->main_mem);       
 

Комментарии:

1. Это умножение на 8 кажется не совсем правильным. write Функция принимает количество байтов в качестве размера, и поскольку каждый «элемент» является байтом main_mem , этого достаточно.

2. Возможно, я скопировал число из его цикла. Я исправлю.

3. Использование этого приведения выдает ошибку: ошибка: недопустимый static_cast из типа ‘std::unique_ptr<unsigned char []>::pointer’ {он же ‘unsigned char*’} в тип ‘const char*’ myfile . запись(static_cast<const char*>(main_mem_.get()), model_header_->main_mem);

4. затем используйте reinterpret_cast , я обновил ответ

Ответ №2:

Я понятия не имею, почему вы используете a std::unique_ptr<uint8_t[]> , поэтому я дам ответ, используя лучшую альтернативу IMHO std::vector<uint8_t> . Или даже более общий

 template<typename T>
void Tofile(std::string_view fileName, std::vector<T> constamp; vec) {
   std::ofstream fs(fileName);
   if (!fs) throw std::exception("filestream is not available for some reason");
   std::copy(cbegin(vec), cend(vec), std::ostream_iterator<T>(fs));
}