Существует ли лучший способ распечатать строку с судом до символов N?

Лучший способ справиться с этим - разделить вашу регистрацию на Установщики и использовать регистрацию по соглашению для явной регистрации определенных групп компонентов с желаемой конфигурацией.

Например:

container.Register(Classes.FromThisAssembly()
    .InSameNamespaceAs()
    .WithService.DefaultInterfaces()
    .LifestyleTransient());

Таким образом, это ясно и ясно, что происходит.

6
задан 16 February 2009 в 08:01
поделиться

4 ответа

Можно использовать метод 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;

но я не уверен, что это на самом деле немного лучше (или более ясно).

7
ответ дан 10 December 2019 в 00:45
поделиться

См. комментарии: Я признаю ошибку. Я был 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;
-2
ответ дан 10 December 2019 в 00:45
поделиться
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" (один), который может перепутать ад из людей),

5
ответ дан 10 December 2019 в 00:45
поделиться

Почему Вы устанавливаете размер на 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);
}

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

0
ответ дан 10 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: