Лучший способ справиться с этим - разделить вашу регистрацию на Установщики и использовать регистрацию по соглашению для явной регистрации определенных групп компонентов с желаемой конфигурацией.
Например:
container.Register(Classes.FromThisAssembly()
.InSameNamespaceAs()
.WithService.DefaultInterfaces()
.LifestyleTransient());
Таким образом, это ясно и ясно, что происходит.
Можно использовать метод ostream:: запишите на объекте суда:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<char> test;
test.push_back('a');
test.push_back('b');
test.push_back('c');
cout.write(&test[0], 3);
cout << endl;
}
Выводы:
abc
С тех пор ostream:: запишите возвратам ostream&, содержащий *это, можно даже сделать
cout.write(&test[0], 3) << endl;
но я не уверен, что это на самом деле немного лучше (или более ясно).
См. комментарии: Я признаю ошибку. Я был mininformed. Однако я все еще думаю, что это гаек для доверия внутренностям как это. Последний компилятор Microsoft я использовал нарушенные стандарты C99, вызывающие меня никакой конец горя. Если они не могут разобраться в возвращаемых значениях на vsnprinf () или новый, Вы действительно хотите полагаться на опечатки как это?
Вы делаете предположения относительно того, как векторный реализован. Вы предполагаете, что v[1] прибывает прямо после v [0] в памяти.
Существует различие между символом buf []; и buf[1] == и buf [0] + 1 и вектор v; и v[1] == и v [0] + 1. Массив символов использует адресную арифметику с указателями. Вектор использует оператор []. Как вектор хранит данные внутренне, смежно ли это или нет, до того векторного класса.
В то время как Ваш код может все еще работать, это - все еще ПЛОХАЯ вещь! Это делает Ваше программное обеспечение хрупким, заставляя это прервать странные и ожидаемые пути, когда Вы меньше всего ожидаете это!
Это - идеальная ситуация для временного массива символов на локальном стеке. Размер является небольшим. У Вас есть hardcoded максимальный размер.
Если бы размер не был постоянным, то я все еще использовал бы маленький локальный буфер массива символов на стеке. Я просто добавил бы его к станд. C++:: строка после каждого повторения. (Да, станд.:: строки могут сохранить двоичные значения включая несколько нулевых символов.)
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;
vector<char> v;
v.reserve(1024*16); //required
v.resize(1); //so we can do &v[0]
recv(sockfd, &v[0], v.capacity(), 0);
Тот код имеет ошибку. Вызов reserve
только гарантирует Вам, что Вы можете push_back, по крайней мере, что много элементов до ссылок и итераторов к вектору делаются недействительным снова (посредством возможного перераспределения используемого буфера). Это не позволит Вам писать в v [0.. 1024*16-1], как Вы делаете там с recv
. Необходимо сделать
v.resize(1024*16); //required
на самом деле иметь это в наличии много элементов и на самом деле передать v.size()
вместо v.capacity()
.
Для Вашей операции подстроки я, вероятно, сделал бы
std::string str(&v[0], n);
std::cout << str;
Где n колеблется от 0 до v.size (). Можно использовать std::min(n, v.size())
гарантировать, если n мог бы быть больше в Вашем случае и необходимость в верхнем пределе.
(на узле стороны я постарался бы не называть переменную "l" (эль) там, потому что он может очень походить "1" (один), который может перепутать ад из людей),
Почему Вы устанавливаете размер на 1?
При резервировании пространства, место является свободным для вектора для превращения (не перераспределяя). Но кто сказал, что было безопасно использовать непосредственно? Я видел (отлаживают) реализации, которые добавляют буфер предупреждения сразу после того, как размер () изменяет эти биты, и он генерировал бы утверждение в следующий раз, когда он проверил. Необходимо только читать/писать от 0-> размер ().
NB Это затем также позволит Вам использовать v [len] = '\0';
vector<char> v(1024*16);
std::size_t len = recv(sockfd, &v[0], v.size(), 0);
while (len > 0)
{
v[len] = '\0';
cout << &v[0];
len = recv(sockfd, &v[0], v.size(), 0);
}
Обратите внимание, что это - вероятно, не лучший способ считать строку.
Я передал бы информацию о длине по потоку, таким образом, Вы знаете, когда нет большей информации для чтения затем только для чтения так, как требуется.