1

This is a program which is supposed to read an inventory of books from a text file (each line of the text file contains a different field, in the correct order, for each book). For some reason the routine continues indefinitely. The "eof" error trapping seems to not catch the end of file. Can anybody give me an idea what is wrong? Please remember I am a true newbie in the c++ world, but not a newbie to programming.

First, the structure definition for Book

// structure definition
struct Book
{   string isbn;
    string title;
    string author;
    string publisher;
    int quantity;
    float price; };

I have included the proper header files. Below is the routine that seems to not be working. I put in some cout << "made it to line 1" endl; code to see the progress of the routine, and it simply repeats fetching data from the text file. The text file has just 6 books in it, so it should end reading through the text file rather quickly.

Thank you, kindly, for any assistance!

void readInventory(string fileName, vector<Book>& inventory)
{
    ifstream instream;
    // tries to open the file
    instream.open(fileName);

    // checkes if the file is open
    if (instream)
    {
        // string line;
        // reads through the file line by line
        while (!instream.eof())
        {
            Book newBook;

            // read book from text file
            instream >> newBook.isbn;
            instream >> newBook.title;
            instream >> newBook.author;
            instream >> newBook.publisher;
            instream >> newBook.quantity;
            instream >> newBook.price;

            // add this book to inventory
            inventory.push_back(newBook);
        }

        instream.close();
        showMessage(to_string(inventory.size()) + " books were successfully added to inventory");
    }

    // if failed to open the file
    else
        showMessage("Cannot open the file. Make sure the file name is correct");
}
DimChtz
  • 3,233
  • 1
  • 15
  • 29
Bill Young
  • 11
  • 2

1 Answers1

0

You can write program like this .

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <set>
#include <queue>
#include <fstream>
#include <sstream>

using namespace std;
// structure definition
struct Book
{   string isbn;
    string title;
    string author;
    string publisher;
    int quantity;
    float price;

};

void fillBook(const std::string& line,Book& book)
{
    std::stringstream is(line);
    std::string tempStr;
    short cnt = 0;

    while(std::getline(is, tempStr, ' '))
    {
        if(cnt ==0)
            book.isbn =tempStr;
        else if(cnt ==1)
            book.title = tempStr;
        else if(cnt ==2)
            book.author = tempStr;
        else if(cnt ==3)
            book.publisher= tempStr;
        else if(cnt ==4)
            book.quantity = atoi(tempStr.c_str());
        else if(cnt == 5)
            book.price = atof(tempStr.c_str());

        ++cnt;
    }

}

void readInventory(string fileName, vector<Book>& inventory)
{
    ifstream instream;
    // tries to open the file
    instream.open(fileName);

    // checkes if the file is open
    if (instream)
    {
        // string line;
        // reads through the file line by line
        std::string line;
        while (std::getline(instream, line, '\n'))
        {
            Book newBook;

            fillBook(line,newBook);

            // add this book to inventory
            inventory.push_back(newBook);
        }

        instream.close();
        std::cout<<(to_string(inventory.size()) + " books were successfully added to inventory");
    }

    // if failed to open the file
    else
        std::cout<<("Cannot open the file. Make sure the file name is correct");
}
mystic_coder
  • 444
  • 2
  • 10