2017-08-08 3 views
1

J'ai écrit ce morceau de code qui est destiné à recevoir des valeurs en utilisant un argument istr pour les produits et ça fonctionne très bien, mais j'ai réalisé que vous ne pouviez pas laisser un champ vide. Un de mes champs traite des unités d'un produit et certains produits n'ont pas d'unités. Dans ce cas, l'utilisateur appuie simplement sur Entrée pour passer à la valeur reçue suivante, mais le problème est qu'il continue à aller jusqu'à une nouvelle ligne jusqu'à ce que la valeur est reçue. Que puis-je faire pour accepter des valeurs vides? Je suis juste concentré sur le champ de l'unité, mais j'ai fourni toute la fonction si quelqu'un avait besoin de le voir. Voici mon code:Accepter une valeur vide pour istream

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; 
    } 
} 

Répondre

2

Lire les valeurs via std::getline(). Si vous obtenez une chaîne non vide, l'analyser, sinon l'ignorer.

+0

Et vous pouvez utiliser ['std :: istringstream'] (http://en.cppreference.com/w/cpp/io/basic_istringstream) pour l'analyser. –

+0

Je préférerais quelque chose comme lexical_cast. Je ne sais pas si c'est standard. –

+0

@MinorThreat: [std :: lexical_cast - Y at-il une telle chose?] (Https://stackoverflow.com/questions/8065413/) –