См. Комментарии: Я стою исправлены. Я был малоинформирован. Тем не менее, я все еще думаю, что орехи полагаются на такие внутренние элементы. Последний компилятор microsoft, который я использовал, нарушал стандарты C99, не вызывающие у меня конца горя. Если они не могут получить возвращаемые значения прямо на vsnprinf() или new, Вы действительно хотите полагаться на такие ошибки?
Вы делаете предположения относительно того, как выполняется вектор. Вы предполагаете, что v [1] появляется сразу после v [0] в памяти.
Существует разница между char buf []; & buf [1] == & buf [0] + 1 и vector v; & v [1] == & v [0] + 1. Массив char использует арифметику указателя. Вектор использует оператор []. Как вектор хранит данные внутри, независимо от того, является ли он смежным или нет, до этого векторного класса.
Пока ваш код все еще может работать, это все равно
BAD вещь! Это делает ваше программное обеспечение хрупким, заставляя его ломаться странными и ожидаемыми способами, когда вы меньше всего этого ожидаете!
Это идеальная ситуация для временного массива символов в локальном стеке. Размер небольшой. Максимальный размер жесткого диска.
Если размер не был постоянным, я все равно использовал бы небольшой локальный буфер массива символов в стеке. Я просто добавляю его в строку std :: C++ после каждой итерации. (Да, std :: строки могут хранить двоичные значения, включая несколько нулевых символов.)
recv() возвращает количество байтов, которое оно считывает. Вектор v не автоматически принимает это. Поэтому вам нужно сохранить и использовать это значение.
Я предлагаю:
#define BUFFER_SIZE (1024*16)
#define FLAGS 0
int received = 0;
int total = 0;
char buffer [ BUFFER_SIZE + 1 ];
memset(buffer, 0, BUFFER_SIZE + 1);
received = recv(sockfd, buffer, BUFFER_SIZE, FLAGS);
if (received > 0)
{
copy(buffer + total,
buffer + total + received,
ostream_iterator<char>(cout));
total += received;
}
while((received > 0) && (total < BUFFER_SIZE))
{
received = recv(sockfd, buffer + total, BUFFER_SIZE - total, FLAGS);
if (received > 0)
{
copy(buffer + total,
buffer + total + received,
ostream_iterator<char>(cout));
total += received;
}
}
buffer [ total ] = '\0';
buffer [ BUFFER_SIZE ] = '\0';
cout << "The total size is " << total << endl;
Этот код не работает. Ужасно. Использование вектора для выделения массива (что в действительности происходит там) не только опасно (векторы MEANT перераспределяют свои внутренние массивы!), Но также бессмысленно. –
По крайней мере, используйте v.resize (1024 * 16), если вы * должны * использовать вектор, но, как упоминалось dionadar, делать это таким образом не является хорошей идеей и в принципе не защищает вас от чего-либо в любом случае и может привести к некоторые интересные ночи отлаживают этот код. –
что не так с его использованием вектора? если размер динамический, я не вижу ничего плохого с ним –