WHILE цикл и ввод данных - PullRequest
       8

WHILE цикл и ввод данных

0 голосов
/ 29 марта 2012

Ранее я пытался использовать цикл for для ввода данных, но это стало слишком проблематично. Поэтому я попытался использовать цикл while, он работает, но когда я попытался отладить его, он продолжал помещать -858993460 в каждый слот. Файл .dat находится в нужном месте и открывается.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

struct record
{
    int item_id;
    string item_type;
    float item_price;
    int num_stock;
    string item_title;
    string item_author;
    int year_published;
};

void read_all_records(record records[], int &valid_entries);
int num_inventory_of_type(record records[], string type, int &valid_entries);
const int max_array = 100;
int main()
{
    int valid_entries = 0;
    record records[max_array];
    read_all_records(records, valid_entries);

    cout << "Stock Report" << endl;
    cout << "------------" << endl;
    int book = num_inventory_of_type(records, "book", valid_entries);
    cout << "Book's In Stock: " << book << endl;
    int cd = num_inventory_of_type(records, "cd", valid_entries);
    cout << "CD's In Stock: " << cd << endl;
    int dvd = num_inventory_of_type(records, "dvd", valid_entries);
    cout << "DVD's In Stock: " << dvd << endl;

    return 0;
}

void read_all_records(record records[], int &valid_entries)
{
    ifstream invfile;
    invfile.open("inventory.dat"); 
    if (!invfile.is_open())
    {
        cout<<"file open failed";
        exit(1);
    }
    while(invfile.good() && valid_entries < max_array)
    {
        invfile >> records[valid_entries].item_id >> records[valid_entries].item_type
            >> records[valid_entries].item_price >> records[valid_entries].num_stock
            >> records[valid_entries].item_title >> records[valid_entries].item_author
            >> records[valid_entries].year_published;
        if(!invfile.good())
            break;
        valid_entries++;

    }
    invfile.close();

}
int num_inventory_of_type(record records[], string type, int &valid_entries)
{
    int count = 0;
    int holder = 0;
    for (int count = 0; count<valid_entries; count++);
    {       
        if (records[count].item_type == type)
        {
            holder+=records[count].num_stock;

        }
    }

    return holder;
}

.dat файл

123456
book
69.99
16
Problem_Solving_With_C++
Walter_Savitch
2011
123457
cd
9.99
32
Sigh_No_More
Mumford_and_Sons
2010
123458
dvd
17.99
15
Red_State
Kevin_Smith
2011
123459
cd
9.99
16
The_Church_Of_Rock_And_Roll
Foxy_Shazam
2012
123460
dvd
59.99
10
The_Walking_Dead_Season_1
Robert_Kirkman
2011 

все в новых строках, без пробелов.

По сути, он должен запуститься, запустить функцию read_all_records и поместить данные .dat в массив. Однако я поместил cout << records[count].item_id; в цикл while, чтобы посмотреть, действительно ли поступают данные, и каждый раз получаю -858993460. После этого он должен запустить следующую функцию 3 раза и вернуть количество каждой книги.

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Вы использовали целочисленный тип int для item_price. invfile >> records[count].item_price будет затем извлекать 69 вместо 69.99, что приведет к ошибке при попытке извлечь year_published.

Используйте взамен float или double.

struct record
{
    int item_id;
    string item_type;
    float item_price;
    int num_stock;
    string item_title;
    string item_author;
    int year_published;
};

/* skipped identical lines */

while(invfile.good() && count < max_array)
{
    invfile >> records[count].item_id >> records[count].item_type
        >> records[count].item_price >> records[count].num_stock
        >> records[count].item_title >> records[count].item_author
        >> records[count].year_published;
        cout << records[count].item_price << endl;
        if(!invfile.good())
            break;
    cout << records[count].item_id << endl;
        count++;
}
invfile.close();

Обратите внимание, что у вас есть лишняя точка с запятой в for (int count = 0; count<max_array; count++);. Я полагаю, вы не собирались этого делать, поэтому удалите его.

1 голос
/ 29 марта 2012

Это не прямой ответ на проблему, но, возможно, он исчезнет после рефакторинга:

std::istream& operator>>(std::istream& is, record& r) {
    return is >> r.item_id >> r.item_type >> … >> r.year_published;
}

int main () {
    if (std::ifstream invfile("inventory.dat")) {
        std::vector<record> records((std::istream_iterator<record>(invfile)),
                                     std::istream_iterator<record>());

        num_inventory_of_type(records, "dvd");
        num_inventory_of_type(records, "cd");
        num_inventory_of_type(records, "book");
    }
}

Если вы все еще хотите распечатать каждую запись во время ее чтения, код можетпереставить следующим образом:

        std::vector<record> records;
        for (std::istream_iterator<record> i(invfile);
             i != std::istream_iterator<record>(); ++i)
        {
            records.push_back(*i);
            std::cout << i->item_id << "\n";
        }
0 голосов
/ 29 марта 2012

Вам нужно изменить int item_price; поплавку так -> float item_price;

и, как уже упоминалось выше, вам нужно поменять счет ++; и cout << records [count] .item_id line. </p>

После этих двух изменений он будет работать правильно.

struct record
{
    int item_id;
    string item_type;
    float item_price; // <--- Needs to be a float
    int num_stock;
    string item_title;
    string item_author;
    int year_published;
};


// This order is required because you are storing in the current 'count' record and then you need to print it.  Then increment the count to store the next record  
cout << records[count].item_id;
count++;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...