2017-01-20 7 views
0

У меня проблема с чтением двоичного файла.Как читать double из двоичного файла и сохранять его в векторе

Мой код до сих пор:

ifstream file("ns.bin", ios::in | ios::binary | ios::ate); 
file.seekg(0, std::ios::end); 
size = file.tellg(); 
file.seekg(0, std::ios::beg); 
buffer = new char[size]; 
file.read(buffer, size); 
file.close(); 

double* double_values = (double*)buffer;//reinterpret as doubles 

Мой вопрос: Как я могу получить двойники от double_values в вектор этого типа:

vector<double> buffer2; 

Или, если не представляется возможным: Как сделать Я получаю количество двухместных номеров от double_values?

Надеюсь, что sb может мне помочь!

ответ

0

Просто скопируйте его в вектор:

vector<double> buffer2(double_values, double_values + (size/sizeof(double))); 

Объяснение:

Это использует итератора конструктор std::vector (вариант 4 here), который ожидает начать итератор и итератор конца. Указатели - итераторы, и чтобы получить конечный итератор, вам нужно знать, сколько элементов находится в массиве.

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

Тогда становится тривиально найти конечный итератор, добавив размер итератора начала.

+0

Спасибо! для вас aswer и хорошее объяснение :) У меня есть другой вопрос, может быть, у вас есть идея :) Я попытался напечатать вектор с помощью cout, а в качестве ограничения я установил количество удвоений size/sizeof (double) ... и он работает. он печатает каждый двойной (size/sizeof (double), это также правильный номер), но в конце он печатает также sth, но вы не видите ничего похожего на то, что он печатает пробелы ... поэтому я попробовал его также с 2d вектор, и здесь он печатает некоторые 0 с ... у вас есть идея, почему? – Ildon

+0

Сложно сказать, в чем конкретно заключается ваша проблема, но я бы предположил, что вы пытаетесь напечатать одно из последних элементов; 'cout << buffer2 [buffer2.size()]' - неопределенное поведение –

0

Во-первых, проблема. Он полностью отвечал здесь: How to initialize std::vector from C-style array?

const int size = 64; 
char* chars = new char[64]; 
double* double_values = (double*)chars; 

const int size_of_doubles = (sizeof(char)*size)/sizeof(double); 
std::cout<<"Doubles: "<<size_of_doubles<<'\n'; 
std::vector<double> buffer2(double_values, double_values+size_of_doubles); 
std::cout<<buffer2.size(); 
delete chars; 

Я бы также заметить, что неразумно напрямую копировать переменные в двоичную и обратно. Такие проблемы, как размер шрифта, конечность или (в случае текстовой) кодировки, могут возникать и прерывать вашу программу на разных компьютерах.

+0

Я не верю, что 'std :: end' будет работать в этом случае, потому что' double_values' имеет тип указателя, а не тип массива http://en.cppreference.com/w/cpp/iterator/end –

+0

@ RussellGreene True, исправлено. –

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

  • Нет связанных вопросов^_^