商品库存添加/编辑/查看问题

时间:2015-03-25 05:44:30

标签: c++ inventory repeat

好的,所以我对此有很多疑问。我遇到了很多麻烦,但我慢慢地到了那里。到目前为止,我已将它用于程序读取和写入文件的位置,但它往往会重复很多次。就像从文件中读取一样,只是一遍又一遍地阅读相同的信息。此外它似乎两次显示相同的记录...我不能进一步测试它,因为它只允许我一遍又一遍地写第一个记录而不写第二个。任何帮助都会很棒。由于某些原因,编辑功能似乎在选择1条记录时会出现乱码...所以我很难过。几个小时都没有运气

#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>

using namespace std;

void addRecord(fstream &);
void viewRecord(fstream &);
void changeRecord(fstream &);
int menu();

const int DESC_SIZE = 21;
const int DATE_SIZE = 11;

struct inventoryData

{
        char desc[DESC_SIZE]; //Desc up to 20 chars
        int quantity; //Item quantity
        double wholesale; //Item wholsale Cost
        double retail; //Item retail Cost
        char date[DATE_SIZE]; //Date able to hold info up to xx/xx/xxxx

};


int main()
{
    int selection;
    int recordNumber;

    fstream dataFile("inventory.dat", ios::in | ios::out | ios::binary);
    if (dataFile.fail())
    {
        // The file does not exist, so create it.
        dataFile.open("inventory.dat", ios::out);
    }


    selection = menu();

    while (selection != 4)
    {
        switch (selection)
            {
                case 1:
                    {
                         viewRecord(dataFile);
                         break;
                    }
                case 2:
                {
                          addRecord(dataFile);
                          break;
                }
                case 3:
                    {
                         changeRecord(dataFile);
                         break;
                    }
                default:
                    {
                        cout << "Invalid - Please use 1 to 4" << endl;
                        break;
                    }
                    selection = menu();
            }
    }

    dataFile.close();

    return 0;
}

void addRecord(fstream &file)
{
    fstream dataFile("inventory.dat", ios::in | ios::out | ios::binary);
    inventoryData item;

    cout << "Please enter the following data about the item" << endl;
    cout << "Description: ";
    cin.ignore();
    cin.getline(item.desc, DESC_SIZE);
    cout << "Quantity: ";
    cin >> item.quantity;
    cout << "Quantity: ";
    cin >> item.quantity;
    cout << "Wholesale cost: ";
    cin >> item.wholesale;
    cout << "Retail price: ";
    cin >> item.retail;
    cout << "Date (Please use MO/DA/YEAR format: ";
    cin >> item.date;
    dataFile.write(reinterpret_cast<char *>(&item), sizeof(item));

    return;
}

void viewRecord(fstream &file)
{
    string output;
    fstream dataFile("inventory.dat", ios::in | ios::out | ios::binary);

    inventoryData item;
    fstream items;
    char again;

    dataFile.read(reinterpret_cast<char *>(&item), sizeof(item));

    while (!items.eof())
    {
    // Display the record.
    cout << "Description: " << item.desc << endl;
    cout << "Quantity: " << item.quantity << endl;
    cout << "Wholesale Cost: " << item.wholesale << endl;
    cout << "Retail Cost: " << item.retail << endl;
    cout << "Date: " << item.date << endl;

    // Wait for the user to press the Enter key.
    cout << "\nPress the Enter key to see the next record.\n";

    cin.get(again);
    // Read the next record from the file.
    dataFile.read(reinterpret_cast<char *>(&item), sizeof(item));
    }
}


void changeRecord(fstream &file)
{
    fstream dataFile("inventory.dat", ios::in | ios::out | ios::binary);

    inventoryData item;
    int recordNumber;

    cout << "Please choose a record number you want to edit" << endl;
    cin >> recordNumber;
    dataFile.seekg(recordNumber * sizeof(item), ios::beg);
    dataFile.read(reinterpret_cast<char *>(&item), sizeof(item));
    cout << "Description: " << item.desc << endl;
    cout << "Quantity: " << item.quantity << endl;
    cout << "Wholesale cost: " << item.wholesale << endl;
    cout << "Retail price: " << item.retail << endl;
    cout << "Date: " << item.date << endl;
    cout << endl;

    // Get the new record data.
    cout << "Enter the new data:\n";
    cout << "Description: ";
    cin.ignore();
    cin.getline(item.desc, DESC_SIZE);
    cout << "Quantity: ";
    cin >> item.quantity;
    cout << "Quantity: ";
    cin >> item.quantity;
    cout << "Wholesale cost: ";
    cin >> item.wholesale;
    cout << "Retail price: ";
    cin >> item.retail;
    cout << "Date (Please use MO/DA/YEAR format: ";
    cin >> item.date;

    // Move back to the beginning of this record's position
    dataFile.seekp(recordNumber * sizeof(item), ios::beg);
    // Write new record over the current record
    dataFile.write(reinterpret_cast<char *>(&item), sizeof(item));

}

int menu()
{
    int menuSelection;

    cout << fixed << showpoint << setprecision(2);
    cout << "----------Inventory----------" << endl;
    cout << "1 - View inventory" << endl;
    cout << "2 - Add an item" << endl;
    cout << "3 - Edit an item" << endl;
    cout << "4 - End Program" << endl;
    cin >> menuSelection;

    if (!cin)
    {
        cout << "Invalid - Please use 1 to 4" << endl;
        cin >> menuSelection;
    }

    if (menuSelection < 1 || menuSelection > 4)
    {
        cout << "Invalid - Please use 1 to 4" << endl;
        cin >> menuSelection;
    }

    return menuSelection;
}

1 个答案:

答案 0 :(得分:0)

int menu()
{
    int menuSelection = 0;//initialize

    cout << fixed << showpoint << setprecision(2);
    cout << "----------Inventory----------" << endl;
    cout << "1 - View inventory" << endl;
    cout << "2 - Add an item" << endl;
    cout << "3 - Edit an item" << endl;
    cout << "4 - End Program" << endl;

    //*** flush cin, this is inside a loop, it can cause problems
    cin.clear();
    fflush(stdin);
    cin >> menuSelection;

    return menuSelection;
}

int main()
{
    fstream dataFile("inventory.dat", ios::in | ios::out | ios::binary);
    if (dataFile.fail())
    {
        // The file does not exist, so create it.
        dataFile.open("inventory.dat", ios::out);
        dataFile.close();
    }

    for (;;)
    {
        int selection = menu();
        if (selection == 4)
            break;

        switch (selection)
        {
        case 1:
            viewRecord(dataFile);
            break;
        case 2:
            addRecord(dataFile);
            break;
        case 3:
            changeRecord(dataFile);
            break;
        default:
            cout << "Invalid - Please use 1 to 4" << endl;
            break;
        }
    }

    return 0;
}

void viewRecord(fstream &notused)
{
    fstream dataFile("inventory.dat", ios::in | ios::out | ios::binary);
    inventoryData item;
    while (dataFile)
    {
        dataFile.read(reinterpret_cast<char*>(&item), sizeof(item));
        // Display the record.
        cout << "Description: " << item.desc << endl;
        cout << "Quantity: " << item.quantity << endl;
        cout << "Wholesale Cost: " << item.wholesale << endl;
        cout << "Retail Cost: " << item.retail << endl;
        cout << "Date: " << item.date << endl;
        cout << endl;
    }
}

void addRecord(fstream &notused)
{
    fstream file("inventory.dat", ios::in | ios::out | ios::app | ios::binary);
    inventoryData item;

    cout << "Please enter the following data about the item" << endl;
    cout << "Description: ";
    cin.ignore();
    cin.getline(item.desc, DESC_SIZE);

    cout << "Quantity: ";
    cin >> item.quantity;

    cout << "Wholesale cost: ";
    cin >> item.wholesale;

    cout << "Retail price: ";
    cin >> item.retail;

    cout << "Date (Please use MO/DA/YEAR format: ";
    cin.getline(item.desc, DATE_SIZE);

    file.write(reinterpret_cast<char *>(&item), sizeof(item));

    return;
}