Возврат ссылки на сам объект потока дает вам отличный способ проверить достоверность операций ввода / вывода: если операция завершается неудачей, объект потока находится в состоянии сбоя, что означает, что он будет оцениваться до false
в логическом контексте. Таким образом мы можем написать:
while (std::getline(instream, str)) { /* ... process line ... */ }
if (anotherstream >> x >> y) { /* process x and y */ }
else { /* error, at least one extraction failed */ }
if (!laststream.read(buf, sizeof(buf)) { /* error */ }
Обратите внимание, в частности, на повторный вызов во втором примере: каждое извлечение возвращает ссылку на объект потока, и поэтому мы можем объединить несколько извлечений в одном операторе, и если любой из них завершится неудачно, все Операция оценит false
.
Вот практический пример, разбор строк вида [x y z]
из стандартного ввода:
for (std::string line; std::getline(std::cin, line); )
{
std::istringstream iss(line);
char l, r;
double x, y, z;
if (!(iss >> l >> x >> y >> z >> r) || (l != '[') || (r != ']'))
{
std::cerr << "Malformed line ('" << line << "'), skipping.\n";
continue;
}
std::cout << "You said: " << x << ", " << y << ", " << z << std::endl;
}