вывод всех элементов массива в файл на с ++ - PullRequest
0 голосов
/ 22 апреля 2019

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

Но все текстовые файлы, созданные этим кодом, печатают только имя первого предмета и цену первого предмета.

Как мне исправить это?

Я уже пробовал создавать разныеклассы для имени клиента и имени элемента \ цены.

Я также пытался создать другой массив для элементов.

 #include "Item.h"
#include "Receipt.h"


Item iArray[1000];
Receipt boA[1000];
int loc = 0;
int y;
string array[];
string iName[1000];
void addItem();
void functFix();
void printI();
void p_opt();
int main()
{
    int sel = 0;

    cout << "Welcome\n\n\n";


    do {
        cout << "Please select an option from the menu below:\n\n";
        cout << "1) Add an order" << endl; //need to find a way to make 1) add 2) print 3)exit
        cout << "2) Exit" << endl;
        cin >> sel;
        system("cls");
        switch (sel) {
        case 1:
            functFix();
            system("cls");

            break;

        case 2:
            cout << "Bye" << endl;
            system("pause");
            exit;
            break;
        default:
            cout << "Invalid option" << endl;
            system("pause");
            system("cls");
            break;




        }
    } while (sel != 2);
    return 0;
}
void addItem()
{
    string itemName;
    double itemPrice;





        cout << "Please enter the item Name: ";
        cin.ignore();
        getline(cin, itemName);
        iArray[loc].setItemName(itemName);
        cout << "Please enter the item Price: ";
        cin >> itemPrice;
        iArray[loc].setItemPrice(itemPrice);





}
void functFix()
{
    string Name;

    cout << "Please enter the customer name: ";
    cin.ignore();
    getline(cin, Name);
    boA[loc].setName(Name);
    ofstream order;
    order.open(boA[loc].getName() + ".txt", ios::out | ios::app); //trying to make customer name to be file name so that  a new file is created once the order is put in place
    order << setw(30) << "MONTILLATECH\n" << setw(40) << "382 Via Versalles Villas Reales\n" << setw(33) << "Guaynabo, PR-00969\n" << setw(31) << "787-678-6043\n\n";
    order << "Customer name: " << Name << endl;
    order << "---------------------------------------" << endl;

    order.close();
    cout << "how many items in the order?" << endl;
    cin >> y;
    for (int i = 0; i < y; i++)
    {
        addItem();
    }
    p_opt();
}
void printI()
{
    ofstream order;
    string filename;

    order.open(boA[loc].getName() + ".txt", ios::out | ios::app); //trying to make customer name to be file name so that  a new file is created once the order is put in place
    order << "Ordered items:\n\n";
    //Need to make a loop that keeps printing items in an array //Array could be of any number but equal to y (y=quantiy of items desired)


    for (loc=0; loc < y; loc++)
    {
        order << iArray[loc].getItemName();
        iArray[loc].getItemPrice();

        order << "Your item name is: " << iArray[loc].getItemName();
        order << " ---------- $" << iArray[loc].getItemPrice() << endl;
        cout << "y: " << y << endl;

    }

    order << "---------------------------------------" << endl;
    cout << "y: " << y << endl;
    order << "\nTotal: total" << " $" << endl;

    order << "---------------------------------------" << endl;
    cout << "\n\n";
    order.close();
    loc++;
}
void p_opt()
{
    int opt1 = 0;


        cout << "Do you want to print the order?" << endl;
        cout << "1) yes" << endl;
        cout << "2) No" << endl;
        cin >> opt1;

        switch (opt1)
        {
        case 1:
            printI();
            break;
        case 2:
            exit;
            break;
        default:
            cout << "Invalid option" << endl;
        }

}

Программа прямо сейчас печатает только последний элемент массива.Должны быть напечатаны все элементы, хранящиеся в массиве.

Пример выполнения кода:

Пожалуйста, введите имя клиента: Test66, сколько элементов в заказе?3 Пожалуйста, введите название товара: item1 Пожалуйста, введите цену товара: 1 Пожалуйста, введите имя товара: item2 Пожалуйста, введите цену товара: 2 Пожалуйста, введите название товара: item3 Пожалуйста, введите товар Цена: 3 Хотите напечатать заказ?1) да 2) Нет 1

текст выводится в текстовом файле:

test 382 Via Versalles Villas Reales Guaynabo, PR-00969 787-678-6043

Имя клиента: Test66

Заказанные товары:

item3 Ваше имя товара: item3 ---------- $ 3

Ваше имя товара: ---------- $ 0

Ваше имя товара: ---------- $ 0

Итого: всего $

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Мне удалось исправить вышеупомянутую проблему путем реструктуризации и организации кода в дополнение к добавлению отдельного массива для имен элементов и цен на элементы.

Я создал:

Item ItemNameArray[];
Item ItemPriceArray[];

Мой код (функция вывода) в итоге выглядел так:

void printOrder()
{


    ofstream order;
    string filename;
    double total;

    order.open(NameArray[loc].getName() + ".txt", ios::out | ios::app);
    order << "Ordered items:\n\n";

    for (int t = 0; t < y; t++) 

/*y is a variable for the amount of items user wants in the
order.*/


    {

        order << "Your item name is: " << itemNameArray[t].getItemName();
        order << " ---------- $" << itemPriceArray[t].getItemPrice() << endl;

    }
    order << "---------------------------------------" << endl;

    Item* tot;
    tot = itemPriceArray;
    for (int o=0;o<y;o++)
    total = total + *(tot + o);

    order << "\nTotal: "<<total<< " $" << endl;

    order << "---------------------------------------" << endl;
    cout << "\n\n";
    order.close();
    loc++;
}

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

тест, 382 Via Versalles Villas Reales, Guaynabo, PR-00969, 787-678-6043

Имя клиента: тестирование 3

Заказанные товары:

Ваше имя предмета: test1 ---------- $ 2

Ваше имя предмета: test2 ---------- $ 3

Ваше имя предмета: test3 ---------- $ 4

Ваше имя предмета: test4 ---------- $ 5


Итого: 14 $


Мне удалось найти ответ на этот вопрос, прочитав статью «Начинаем с C ++» Тони Гаддиса (8-е издание). Спасибо за комментарии и помощь в любом случае.

0 голосов
/ 23 апреля 2019

Следуя моим комментариям.

Это все еще не

  • минимальный - Ваша проблема заключается в записи в файл.Не имеет значения, как вы генерируете данные.Вы могли бы вручную добавить код, который заполняет необходимые структуры без использования пользовательского ввода.
  • complete - опубликованный код по-прежнему не компилируется.Я до сих пор не знаю, что такое Item, и у меня нет файла "Item.h", чтобы это выяснить.
  • проверяемый - отправленные вами данные не соответствуют тому, что генерировал код,Например, нет «Добро пожаловать» ...

пример.Я сомневаюсь, что вы прочитали страницу, на которую я ссылался дважды.

Соблюдение этих требований может показаться педантичным и ненужным, это не так.Чем лучше вы задаете вопрос, тем больше шансов, что кто-то захочет прочитать его и ответить на него.Посмотрите другие вопросы, которые получают много комментариев через минуту или две.Потратьте некоторое время, чтобы кто-то другой захотел инвестировать свое.Не многие люди удосужились прочитать ваши.Цель MCVE также состоит в том, чтобы помочь вам решить эти проблемы самостоятельно - путем понимания того, что не так, какой код неисправен и как объяснить проблему другим и даже себе.Код, опубликованный после редактирования, действительно отличается от кода, приведенного ранее.

В вашем случае создание MCVE с большой вероятностью решит проблему.Следующий цикл с глобальной переменной loc ошибочен:

for (int i = 0; i < y; i++)
{
    //addItem(); expands to:
    //...
    iArray[loc].setItemName(itemName);
    //...
}

Цикл работает с тем же элементом, поскольку переменная loc не изменяется.Это было не в первой версии вашего вопроса!Таким образом, перезаписывая элемент новыми записями, пока не останется последняя запись.Что именно то, что напечатано.Причиной появления строки «Ваше имя элемента: ---------- $ 0» является то, что, вероятно, конструктор по умолчанию Item класса устанавливает имя в пустую строку и цену в ноль.Опять же, это всего лишь предположение, поскольку я не знаю, что такое Item.

Мой совет - избавиться от всех глобальных переменных.Ничего хорошего из них не выйдет.Ваш код кажется грязным (по крайней мере, как здесь написано), поэтому найдите время и разделите программу на независимые строительные блоки, сделайте функцию для каждого блока.Функция тогда действует только на свои аргументы.При необходимости используйте передачу по ссылке.Если переменная (должна быть) передана во все функции, пусть будет так.Это более понятно, и, по моему мнению, больше печатания помогает начинающим изучать язык.Также сказать, что обход кода с помощью отладчика - важный навык, значит преуменьшение.Вы сразу увидите, что элементы массива перезаписываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...