2015-05-12 2 views
0

У меня есть двоичный файл, который содержит удвоения размером 8 байт. Я хочу прочитать двойник в vector<double> см нижечитать двоичный файл в адрес элемента вектора

ifstream infile("x.dat", ios::binary); 
    vector<double>data(filesize/8, 0.0); 
    for(int i=0; i< (filesize/8); ++i) 
    { 
    infile.read((char *) (&data[i]), sizeof(double)); 
    } 

Я знаю, что это будет работать, если данные был C массива, но не уверен, если это будет работать для vector, поскольку vector содержит больше материала, чем C массива (vector имеет методы), имеет ли адрес &data[i] адрес элемента данных i-го элемента?

+2

Да - код в порядке (кроме проверки 'infile' для ошибок открытия/чтения). Почему бы вам не запустить его, доказать, что он работает, и продолжить работу с остальной частью программы? –

+1

'vector' - это последовательные данные о хранении контейнера, такие как массив' C', с дополнительной информацией, например 'size' и' capacity'. Да, он также был предназначен для использования в качестве примитивных массивов. –

+0

Возможный дубликат [Являются ли std :: vector Elements Guaranteed To Continuous] (http://stackoverflow.com/questions/849168/are-stdvector-elements-guaranteed-to-be-contiguous). –

ответ

4

Да, каждый векторный элемент - это всего лишь объект double, а &data[i] указывает на этот объект.

На самом деле, все double объекты находятся в непрерывном массиве, так что вы можете прочитать их все сразу:

infile.read((char*)data.data(), filesize); 

Конечно, как указано ниже, это требует, чтобы файл был написан в формат, совместимый с двоичным представлением вашей программы значений double, иначе значения будут мусором.

+0

спасибо, что означает 'data.data()' здесь? Возвращает ли он адрес для всего смежного массива 'double'? – Allanqunzi

+0

@Allanqunzi: Да, это адрес первого элемента массива. Это то же самое, что и '& data [0]'. –

+0

спасибо, я понял. – Allanqunzi

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