Search code examples
c++arraysstructfstream

How to print data in struct that I've read from a file


I am writing a program to keep track of a bookstore inventory (beginning code). One of the functions of this program is that it can print out the whole inventory in a more or less formatted output. I've gotten it to print out the contents with no spaces or whitespace.

I have the file reading into an array initialized as a struct:

struct Book //declare struct
{

int ISBN; //ISBN within struct

std::string Title; //Title within struct

std::string Author; //Author within struct

std::string Publisher; // Publisher within struct

int Quantity; //Quantity within struct

double Price; //price within struct

};

The contents of the .txt file get read into each memory allocation as their particular data type and then each of these gets printed out.

                                        /* READ CONTENTS OF INVENTORY*/

string readInventory(ifstream &readFile) //define readInventory, pass it a refrence to an infile
{
    const int ARRAY_size = 100;

string_book read_out_inventory[ARRAY_size];

ifstream inFile;

string stub = "\n\n***** COMPLETED: files read ******\n\n";
string buffer = " ";

inFile.open("inventory.txt");

if (!inFile.eof())
{
    for (int i = 0; i < ARRAY_size; ++i)
    {
        inFile >> read_out_inventory[i].ISBN;
        inFile >> read_out_inventory[i].Title;
        inFile >> read_out_inventory[i].Author;
        inFile >> read_out_inventory[i].Publisher;
        inFile >> read_out_inventory[i].Quantity;
        inFile >> read_out_inventory[i].Price;

    }
}

cout << setw(43) <<"The books are: \n\n" ;

for (int ARRAY_read = 0; ARRAY_read < ARRAY_size; ARRAY_read++)
{

    cout << &read_out_inventory[ARRAY_read].ISBN << endl;
    cout << &read_out_inventory[ARRAY_read].Title << endl;
    cout << &read_out_inventory[ARRAY_read].Author << endl;
    cout << &read_out_inventory[ARRAY_read].Publisher << endl;
    cout << &read_out_inventory[ARRAY_read].Quantity << endl;
    cout << &read_out_inventory[ARRAY_read].Price << endl;

}

return stub;

}

The problem I'm running into (amidst other obvious ones) is that the output is :

0x7fff5fbfe250
0x7fff5fbfe268
0x7fff5fbfe280
0x7fff5fbfe288
0x7fff5fbfe290
0x7fff5fbfe298
0x7fff5fbfe2b0
0x7fff5fbfe2c8
0x7fff5fbfe2e0
0x7fff5fbfe2e8
0x7fff5fbfe2f0
0x7fff5fbfe2f8
0x7fff5fbfe310
0x7fff5fbfe328
0x7fff5fbfe340
0x7fff5fbfe348
0x7fff5fbfe350
0x7fff5fbfe358
0x7fff5fbfe370
0x7fff5fbfe388
0x7fff5fbfe3a0
0x7fff5fbfe3a8
0x7fff5fbfe3b0
0x7fff5fbfe3b8
0x7fff5fbfe3d0
0x7fff5fbfe3e8
0x7fff5fbfe400
0x7fff5fbfe408
0x7fff5fbfe410
...

I'm not even fully sure what my problem is so help would be greatly appreciated. I saw this question had been answered in another place but I didn't fully understand.

The .txt file looks like this:

20451
My First Book
Mark Lusk
Pearson Publishing
40
45.34
9780316
Brown Family
Mason Victor
Little Brown
36
105.99
1349877
Story of My Life
Norah M Jones
CreateSpace Independent Publishing Platform
20
18
1234567
The Big Book
Mypals Pennyweather
GreenThumb
4
13.23

Solution

  • There are many mistakes in your code and file

    1. While printing, you are printing address of every index using & operator.
    2. You are using Array_size while printing the whole array, however your file has only 2-3 books.
    3. There are white spaces in your text file and you are reading out of bound number of books.
    4. Here is the modified code I wrote for you, that works for me :)
    string readInventory() //define readInventory, pass it a refrence to an infile
    {
    const int ARRAY_size = 100;
    int countBooksInFile=0;
    Book inventory[ARRAY_size];
    ifstream inFile;
    string stub = "\n\n***** COMPLETED: files read ******\n\n";
    inFile.open("inventory.txt");
    
    if (!inFile.eof())
    {
        inFile >> ws;
        inFile >> inventory[countBooksInFile].ISBN;
        inFile >> ws;
        getline(inFile,  inventory[countBooksInFile].Title);
        inFile >> ws;
        getline(inFile ,inventory[countBooksInFile].Author);
        inFile >> ws;
        getline(inFile, inventory[countBooksInFile].Publisher);
        inFile >> ws;
        inFile >> inventory[countBooksInFile].Quantity;
        inFile >> ws;
        inFile >> inventory[countBooksInFile].Price;
        countBooksInFile++;
    }
    cout << "Total Books: " << countBooksInFile<<endl;
    cout << "The books are: \n";
    
    for (int ARRAY_read = 0; ARRAY_read < countBooksInFile; ARRAY_read++)
    {
    
        cout << inventory[ARRAY_read].ISBN << endl;
        cout << inventory[ARRAY_read].Title << endl;
        cout << inventory[ARRAY_read].Author << endl;
        cout << inventory[ARRAY_read].Publisher << endl;
        cout << inventory[ARRAY_read].Quantity << endl;
        cout << inventory[ARRAY_read].Price << endl;
    
    }
    
    return stub;
    }