2015-08-11 5 views
-2

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

std::vector<uint8_t> buffer_(1000); // the vector is filled with values 
int offset_ = 300; 
std::ofstream output_file (file_name.c_str(), std::ofstream::out | std::ofstream::binary); 
if (output_file.is_open()) { 
    output_file.write(reinterpret_cast<const char*>(&buffer_[offset_]), (buffer_.size() -offset_)*sizeof(uint8_t)); 
    // segmentation fault on the line above 
    output_file.write(reinterpret_cast<const char*>(&buffer_[0]), (offset_)*sizeof(uint8_t)); 
} 

Может кто-нибудь сказать мне, что не так с кодом?

+3

Ваш отладчик может. Вы использовали его еще? –

+2

"' * sizeof (uint8_t) '" o.O Я приветствую создание родового кода, который является надежным для более поздних изменений типа, но так как вы жестко закодировали 'uint8_t', все равно это совершенно без цели. –

ответ

4

Вы начинаете с обработки смещения в виде индекса массива [0] (&buffer_[300]), но затем сразу обрабатываете его как счетчик элементов на основе [1] (buffer_.size()-300). Это приведет к чтению 700 элементов, начиная с элемента 301 st, который проходит мимо конца вашего вектора одним элементом.

Вычитайте один из аргументов, в зависимости от того, что вы на самом деле подразумеваете под «смещением».

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

+0

Не могли бы вы объяснить, почему он получает ошибку Сега? и как это устранит проблему. Это для моего обучения –

+0

@VinayShukla: Потому что он читает память, которую он не должен читать. Изменение кода только для чтения памяти, которое он должен прочитать, устранит проблему. –

+0

Итак, из вашего объяснения я делаю вывод, что он пытается прочитать 300-ю ячейку памяти, которая не существует –

0

Функциональность, заданная по этому вопросу, уже реализована в rotate и rotate_copy. Как правило, повторное внедрение поведения уже в стандарте является расточительным и/или может быть чревато ошибкой, о чем свидетельствует этот вопрос.

Поскольку rotate_copy использует только ForwardIterator с для его ввода итераторы, this answer могут быть использованы с помощью простого использовать ostreambuf_iterator. Так что это можно сделать вместо двух записей в вопросе:

const char* pBufferBegin = reinterpret_cast<const char*>(&*buffer_.data()); 

rotate_copy(pBufferBegin, pBufferBegin + offset_, pBufferBegin + buffer_.size(), ostreambuf_iterator<char>(output_file)); 
+1

Ницца, за исключением того, что ваш выход не совсем прав; OP, похоже, хочет записать двоичные представления своего 'uint8_t' на диск, а не ASCII-представления того же самого. –

+0

@LightnessRacesinOrbit Ух, ты совершенно прав. Я возился с моим ответом, но я не могу придумать способ передать Unformatted Output. В конце концов я признаю, что использование реализации стандарта, вероятно, не лучшее решение здесь :(Я бы дал ваш ответ +1, но я уже это сделал;) –

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