0

I want to code a search function where you can cout the strings from file. THe function request the user to input the first letter of the string wanted to search and the for loops will search the strings which the first letter is same as the user requested. this is my code.

string bid, bname, bAuthor, bcat, bPub;
int bAmt = 0, i = 1;
bool bname2length;
char character[];
char firstChar;
ifstream inBook;
inBook.open("books.txt");

if(inBook.is_open())
{
    cout << setfill('-') << setw(1) << "+" << setw(3) << "-" << setw(1) << "+" << setw(8) << "-" << setw(1) << "+" << setw(40) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(20) << "-" << setw(1) << "+" << setw(20) << "-" << setw(1) << "+" << setw(6) << "-" << setw(1) << "+" << endl;
    cout << setfill(' ') << setw(1) << "|" << setw(3) << left << "No." << setw(1) << "|" << setw(8) << left << "BookID" << setw(1) << "|" << setw(40) << left << "Book Name" << setw(1) << "|" << setw(15) << left << "Author" << setw(1) << "|" << setw(20) << left << "Category" << setw(1) << "|" << setw(20) << left << "Publisher" << setw(1) << "|" << setw(6) << left << "Amount" << setw(1) << "|" << endl;
    cout << setfill('-') << setw(1) << "+" << setw(3) << "-" << setw(1) << "+" << setw(8) << "-" << setw(1) << "+" << setw(40) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(20) << "-" << setw(1) << "+" << setw(20) << "-" << setw(1) << "+" <<  setw(6) << "-" << setw(1) << "+" << endl;

    getline(inBook, bid, '#');
    getline(inBook, bname, '#');
    getline(inBook, bAuthor, '#');
    getline(inBook, bAuthor, '#');
    getline(inBook, bPub, '#');
    inBook >> bAmt;
    inBook.ignore(1);

    while(!inBook.eof())
    {
        cout << setfill(' ') << setw(1) << "|" << setw(3) << left << i << setw(1) << "|" << setw(8) << left << bid << setw(1) << "|" << setw(40) << left << bname << setw(1) << "|" << setw(15) << left << bAuthor << setw(1) << "|" << setw(20) << left << bcat << setw(1) << "|" << setw(20) << left << bPub << setw(1) << "|" << setw(6) << left << bAmt << setw(1) << "|" << endl;
        cout << setfill('-') << setw(1) << "+" << setw(3) << "-" << setw(1) << "+" << setw(8) << "-" << setw(1) << "+" << setw(40) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(20) << "-" << setw(1) << "+" << setw(20) << "-" << setw(1) << "+" << setw(6) << "-" << setw(1) << "+" << endl;

        getline(inBook, bid, '#');
        getline(inBook, bname, '#');
        getline(inBook, bAuthor, '#');
        getline(inBook, bcat, '#');
        getline(inBook, bPub, '#');
        inBook >> bAmt;
        inBook.ignore(1);
        i++;

        cout << "Enter the First Character of Search Obj : ";
        cin >> firstChar;

        while(bid != ' ')
        {
            character[i] = bid;
            i++;
        }

        cout << "Books with First Character of " + firstChar << endl;
        for(int i=0; i<sizeof(character[]); i++)
        {
            if(character[i].chatAt(0) == firstChar)
            {
                cout << character[i] << endl;
            }
        }
    }

    inBook.close();
}

else
{
    cout << "Invalid file!";
}
  • Im sorry for my broken english – Loke Yeongje May 16 '17 at 14:14
  • 2
    Do note that `while(!inBook.eof())` is not the correct way to read from a file. See this for more: http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – NathanOliver May 16 '17 at 14:19

1 Answers1

1

Besides @NathanOliver great post, there's also no need for a raw array. You'll get yourself into trouble. Use a std::vector or something similar.

#include <vector>
std::vector<char> bids;

while(bid != ' ')
{
     bids.push_back(bid);
}
cout << "Books with First Character of " + firstChar << endl;

// C++11 for loop..Otherwise loop with iterators.    
for (const auto& abid : bids)
{  
    cout << bid << endl;
}
jiveturkey
  • 2,301
  • 17
  • 37