Мне нравится следующее, потому что это помещает результаты в вектор, поддерживает строку как delim и дает контроль над хранением пустых значений. Но, это не смотрит как хорошее тогда.
#include
#include
#include
#include
#include
using namespace std;
vector split(const string& s, const string& delim, const bool keep_empty = true) {
vector result;
if (delim.empty()) {
result.push_back(s);
return result;
}
string::const_iterator substart = s.begin(), subend;
while (true) {
subend = search(substart, s.end(), delim.begin(), delim.end());
string temp(substart, subend);
if (keep_empty || !temp.empty()) {
result.push_back(temp);
}
if (subend == s.end()) {
break;
}
substart = subend + delim.size();
}
return result;
}
int main() {
const vector words = split("So close no matter how far", " ");
copy(words.begin(), words.end(), ostream_iterator(cout, "\n"));
}
, Конечно, Повышение имеет split()
, который работает частично как этот. И, если 'пробелом', Вы действительно подразумеваете, что любой тип пробела, с помощью разделения Повышения с is_any_of()
работает отлично.
Нет событий в классе NetworkStream
( см. MSDN ). NetworkStream
наследуется от Stream
, поэтому он следует модели потока, которая не основана на событиях. Если вам нужно получать данные асинхронно, используйте метод BeginRead
Чтобы прояснить ответ Томаса, с объяснением для всех, кто не знаком с методом BeginRead и хочет понять ответ на этот вопрос, вы можете позвонить:
AsyncCallBack MyCallBack = new AsynCallBack(DataReceived);
networkStream.BeginRead(buffer, offset, size, MyCallBack, MyObject);
затем создать функция DataReceived:
private void DataReceived(IAsynResult result)
{
//call receive functionality
}
Это вызовет DataReceived, очень похоже на то, как работает событие SerialPort.DataReceived.