Используйте stringstream для чтения строки различных элементов

0

У меня есть файл, который мне нужно прочитать, который выглядит примерно так:

1 2.23 Dove Body Wash
3 .50 Bic Pen

11 12.99 Tombstone Pizza

Если поле с названиями продуктов может содержать только одно слово (Шампу) или любое количество слов (Big mama homestyle steak fries). Входной файл также может содержать пустые строки, которые мне просто нужно пропустить.

Итак, теперь я выгляжу так (используя getline и stringstream):

Эта структура:

struct CartItem {
string  itemName;
int quantity;
double pricePerItem;

CartItem();
CartItem(string name, int qty,double price);
};

а затем этот код.

while (getline(itemList, inputline)) { //itemlist is my ifstream, inputline is a string declared.
    ss.clear();

    ss.str(inputline);
    ss >> item.quantity >> item.pricePerItem >> item.itemName;
    string word;
    while (ss >> word) 
    {
        item.itemName += " " + word;
    }

    if (ss.fail()) {
        continue;
    }

    else
        shoppingList.push_back(item);

}
sortItems(shoppingList, sortedList);
printReport(sortedList);

но он не работает (просто сбой). Если я заменю фрагмент while(ss >> word) с if(ss>>word) он работает, но я получаю только вторую строку из файла. Может ли кто-нибудь увидеть, что я здесь делаю неправильно?

  • 0
    Просто предложение: вы можете использовать getline в stringstream после удаления количества и цены за единицу, чтобы получить оставшееся имя элемента.
Теги:

1 ответ

0
Лучший ответ

Вы должны предоставить более подробную информацию, например, что означает "просто сбой". Однако, я думаю, у вас проблемы с вашей логикой. ss >> word будет вызываться при окончательной проверке цикла while, когда ss уже не соответствует словам, поэтому слово не будет извлечено в word когда цикл while завершится, установив бит ss fail. Теперь ss.fail() всегда будет правдой, и вы никогда не добавите элементы в свой список.

Я предполагаю, что позже вы полагаетесь на shoppingList имея хотя бы один элемент, и это крушение.

Попробуйте изменить:

while (ss >> word) 
{
    item.itemName += " " + word;
}

чтобы:

while (ss.good()) 
{
    ss >> word;
    item.itemName += " " + word;
}
  • 0
    Большое спасибо, сэр.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню