2015-03-25 3 views
1

Итак, у меня есть много вопросов для этого. У меня были большие проблемы, но я медленно добирался туда. Пока у меня есть это, где программа будет читать и писать в файл, но она, как правило, много повторяет. Как и при чтении из файла, он продолжает читать одну и ту же информацию снова и снова. Также кажется, что она отображает одну и ту же запись дважды ... и я не могу ее проверить, потому что она позволяет мне записывать первую запись снова и снова, даже не записывая вторую. Любая помощь будет большой. Также по какой-то причине функция редактирования, кажется, тянет смехотворность при выборе 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; 
} 

ответ

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

Спасибо очень много. Это сделало так, что программа добавит элемент, а затем вернется в меню. Но просмотр, кажется, показывает элемент дважды, а затем застревает в бесконечном цикле, и добавление, кажется, просто добавляет один отдельный элемент, а затем больше не добавляется. Кроме того, редактирование, похоже, демонстрирует смехотворение, когда оно пытается отобразить выбранный элемент ... тогда тоже не напишет на него. >. < – exo316

+0

Я сделал еще несколько изменений, теперь это своего рода работы. cin внутри меню() вызывало проблемы, ему нужен флеш. Вам нужно работать над функцией редактирования. –

+0

Кстати, когда вы добавляете файл, 'fstream' должен иметь флаг' :: app'. Я обновил это. –

 Смежные вопросы

  • Нет связанных вопросов^_^