Какой контейнер можно использовать для записи двоичного файла? - PullRequest
3 голосов
/ 19 февраля 2009

Я хочу записать массив c в контейнер, и я предпочитаю модифицировать его, если это возможно. Я думал об использовании вектора, но он, кажется, имеет запись (* pchararray, len); функция. String выглядел как лучшая вещь, но у нее тоже нет функции записи?

Ответы [ 7 ]

7 голосов
/ 19 февраля 2009

С учетом

char myarray[10];

Вы можете использовать STL iterator:

vector <char> v;
copy(myarray, myarray + 10, back_inserter(v));

Вы можете использовать конструктор :

vector <char> v(myarray, myarray + 10);

Вы можете изменить размер и скопировать :

vector<char> v(10);
copy(myarray, myarray + 10, v.begin());

(и все это работает аналогично для строки)

Спасибо за комментарии / другие ответы:)

3 голосов
/ 19 февраля 2009

Вектор, строка и многие другие контейнеры имеют конструктор «два итератора» для этой цели:

char raw_data[100];
std::vector<char> v(raw_data, raw_data + 100);
std::string s(raw_data, raw_data + 100);
2 голосов
/ 19 февраля 2009

Выбор контейнера зависит от использования вами отдельных элементов. Если вы имеете в виду копирование массива символов c в conatiner, вот что вы можете использовать:

char buf[ n ];
std::vector<char> vc(n); // Thanks to Éric 
std::copy(buf, buf + n, vc.begin()); 
1 голос
/ 19 февраля 2009

Вы можете использовать:

string s( pchararray, len );  // constructor

Или:

string s;  s.append( pchararray, len ); // append example.

Или string :: insert (), если хотите.

String счастливо обрабатывает нулевые символы ('\ 0'), если вы укажете длину.

См. http://www.cplusplus.com/reference/string/string/

1 голос
/ 19 февраля 2009

Вы можете использовать вектор. Предварительно распределите размер, а затем адресуйте первый байт: векторы гарантированы для смежности, поэтому это всегда верно.

std::vector<char> vBuffer;
vBuffer.resize(nLength);
std::copy(pStart, pEnd, &vBuffer[0]);
1 голос
/ 19 февраля 2009

Не знаю точно, что вы имеете в виду под "написать" комментарий, но

std::vector<char> charBuffer;

функционально эквивалентно массиву c char (байтов)

&charBuffer[0]

дает вам непрерывную базовую память.

Так что теперь вы можете сделать

charBuffer.resize(100);
memcpy(&charBuffer[0], src, charBuffer.size());
0 голосов
/ 19 февраля 2009

Вы должны предпочесть использовать memcpy в этом случае (поскольку вектор содержит тип POD), чем использовать std :: copy, это НАМНОГО быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...