我已经为一家餐馆创建了一个菜单系统。使用数组,我创建了一个系统,用于将新项目添加到菜单并将其打印在文本文件中。这一切都很好。
当我需要编辑项目时,就会出现此问题,例如,如果我添加了3道菜并使用了edit选项,则仅编辑文本文件的第一行,并且当最小值应始终为1时,项目编号将返回0。
如何进行这项工作,以便在编辑第3项时,所做的编辑将显示在第3行的文本文件中,而不是覆盖第1行?
我不确定问题出在哪里,所以我将附加所有项目文件,因为它不太长。
提前谢谢您
。h文件:
#ifndef RESTAURANTMENU_ITEMS_H #define RESTAURANTMENU_ITEMS_H #define MAX_ITEMS 20 #include <iostream> #include <string> #include <limits> #include <fstream> class Item{ private: int itemNumber; std::string itemCategory; std::string itemDescription; double itemPrice; public: Item(); //setter function void setItemDetails(); void editItemDetails(); //getter function void printItemDetails(); //save to file void save(std::ofstream &outfile); }; #endif //RESTAURANTMENU_ITEMS_H
实施文件:
#include "item.h" //constructor Item::Item(){ itemNumber = 0; itemCategory = "Item not categorised."; itemDescription = "No description written."; itemPrice = 0.0; } //setter functions void Item::setItemDetails() { int choice; static int counter = 1; itemNumber = counter++; std::string copyCategory; std::cout << "What category is this item?" << std::endl; std::cout << "1. Meat Dish\n2. Fish Dish\n" "3. Vegetarian Dish\n4. Drink\n"; std::cin >> choice; switch (choice) { case 1: itemCategory = "Meat"; break; case 2: itemCategory = "Fish"; break; case 3: itemCategory = "Vegetarian"; break; case 4: itemCategory = "Drink"; break; default: std::cout << "Error. Please enter a number between 1-4: " << std::endl; std::cin >> choice; } std::cout << "Please enter a short description: " << std::endl; std::cin.ignore(100, '\n'); std::getline(std::cin, itemDescription); std::cout << "Please set the price: " << std::endl; std::cout << "£"; if (!(std::cin >> itemPrice)) { std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cout << "Error. Please enter a number: "; } } void Item::editItemDetails() { int choice; std::string copyCategory; std::cout << "What category is this item?" << std::endl; std::cout << "1. Meat Dish\n2. Fish Dish\n" "3. Vegetarian Dish\n4. Drink\n"; std::cin >> choice; switch (choice) { case 1: itemCategory = "Meat"; break; case 2: itemCategory = "Fish"; break; case 3: itemCategory = "Vegetarian"; break; case 4: itemCategory = "Drink"; break; default: std::cout << "Error. Please enter a number between 1-4: " << std::endl; std::cin >> choice; } std::cout << "Please enter a short description: " << std::endl; std::cin >> itemDescription; //std::cin.ignore(100, '\n'); //std::getline(std::cin, itemDescription); std::cout << "Please set the price: " << std::endl; std::cout << "£"; //if (!(std::cin >> itemPrice)) { //std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //std::cout << "Error. Please enter a number: "; std::cin >> itemPrice; //} } //getter functions void Item::printItemDetails(){ std::cout << "\nItem Number: " << itemNumber << "| Category: " << itemCategory << "| Description: " << itemDescription << "| Price: £" << itemPrice; } //save to file void Item::save(std::ofstream &outfile) { outfile << "\nItem Number: " << itemNumber << "| Category: " << itemCategory << "| Description: " << itemDescription << "| Price: £" << itemPrice; }
main.cpp
#include <iostream>
#include "item.h"
int main() {
Item newDish[MAX_ITEMS];
bool exit = false;
int choice;
int count = 0;
std::ofstream saveFile;
saveFile.open("menu.txt", std::ios::in | std::ios::out);
while (!exit) {
std::cout << "Menu Creation Terminal\n\n" << std::endl;
std::cout << "\tWelcome to Wrapid™ Restaurants\n\n\t\tMenu Creation Terminal\n\n" << std::endl;
std::cout << "1. Add a new dish\n2. Edit Current Menu\n3. Quit\n" << std::endl;
std::cout << "Please select an option: ";
std::cin >> choice;
switch (choice) {
case 1: {
int option = true;
int i;
//create items
std::cout << "Item Creation Menu";
for (i = 0; i < MAX_ITEMS; i++) {
count += 1;
std::cout << "\n\nItem number: " << i+1 << "\n\n";
newDish[i].setItemDetails();
newDish[i].save(saveFile);
std::cout << "Would you like to add another item?" << std::endl;
std::cout << "1. Yes\n2. No" << std::endl;
std::cin >> option;
if (option == 2) {
break;
}
std::cout << "You have added the following items: " << std::endl;
newDish[i].printItemDetails();
}
}
break;
case 2: {
int editOpt;
int i;
//edit items
std::cout << "Edit Current Menu\n\n" << std::endl;
for (i = 0; i < count; i++) {
newDish[i].printItemDetails();
}
std::cout << "\n\nPlease enter the item number of the item you would like to edit: " << std::endl;
std::cin >> editOpt;
while(editOpt > 20) { std::cout << "Error. Limited to 20 items.\n"
"Please try again: "; std::cin >> editOpt; }
i = editOpt-1;
newDish[i].editItemDetails();
newDish[i].save(saveFile);
}
break;
case 3: {
std::cout << "Thanks for using this terminal. Have a nice day." << std::endl;
exit = true;
}
break;
default: {
std::cout << "Error. Invalid selection. Please select a valid option: " << std::endl;
std::cin >> choice;
}
}
}
saveFile.close();
return 0;
}
我已经为一家餐馆创建了一个菜单系统。使用数组,我创建了一个系统,用于将新项目添加到菜单并将其打印在文本文件中。这一切都很好。出现问题了...
在main中更改此行,因为每次您覆盖文件时,请始终以追加模式打开文件