Принятие пустого значения для istream

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

std::istream& AmaProduct::read(std::istream& istr) { //receives values using istr argument
    char skuField[10];
    char nameField[100];
    double priceField;
    char taxField;
    int qtyField;
    char unitField[11];
    int qtyNeededField;
    if (!istr.fail()) {
      err_.clear();
    }
    cout << "Sku: ";
    istr >> skuField;
    sku(skuField);
    cout << "Name: ";
    istr >> nameField;
    name(nameField);
    cout << "Unit: ";
    istr >> unitField;
    unit(unitField);
    err_.clear();
    cout << "Taxed? (y/n): ";
    istr >> taxField;
    if (taxField == 'Y' || taxField == 'y' || taxField == 'N' || taxField == 'n') {
      taxed(taxField == 'Y' || taxField == 'y');
      istr.ignore(500, '\n');
    }
    else {
      err_.message("Only (Y)es or (N)o are acceptable");
      istr.setstate(ios::failbit);
    }
    if (err_.isClear()) {
    cout << "Price: ";
    istr >> priceField;
    price(priceField);
    }
    if (istr.fail() && err_.isClear()) {
      err_.message("Invalid Price Entry");
    }
    if (err_.isClear()) {
    cout << "Quantity On hand: ";
    istr >> qtyField;
    quantity(qtyField);
    }
    if (istr.fail() && err_.isClear()) {
      err_.message("Invalid Quantity Entry");
    }
    if (err_.isClear()) {
    cout << "Quantity Needed: ";
    istr >> qtyNeededField;
    qtyNeeded(qtyNeededField);
    }
    if (istr.fail() && err_.isClear()) {
      err_.message("Invalid Quantity Needed Entry");
    }
  return istr;
  }
}

person Glaz    schedule 08.08.2017    source источник


Ответы (1)


Чтение значений через std::getline(). Если вы получили непустую строку, проанализируйте ее, иначе пропустите.

person Minor Threat    schedule 08.08.2017
comment
И вы можете использовать std::istringstream для его анализа. - person Remy Lebeau; 08.08.2017
comment
Я бы предпочел что-то вроде lexical_cast. Хотя не уверен, что это стандарт. - person Minor Threat; 08.08.2017
comment
@MinorThreat: std::lexical_cast - есть ли такая вещь? - person Remy Lebeau; 08.08.2017