编辑文本文件c ++

问题描述 投票:0回答:1

我已经为一家餐馆创建了一个菜单系统。使用数组,我创建了一个系统,用于将新项目添加到菜单并将其打印在文本文件中。这一切都很好。

当我需要编辑项目时,就会出现此问题,例如,如果我添加了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;
}

我已经为一家餐馆创建了一个菜单系统。使用数组,我创建了一个系统,用于将新项目添加到菜单并将其打印在文本文件中。这一切都很好。出现问题了...

c++ arrays text-files edit
1个回答
0
投票

在main中更改此行,因为每次您覆盖文件时,请始终以追加模式打开文件

© www.soinside.com 2019 - 2024. All rights reserved.