#include #include #include #include #include #include #include "Business.h" int main(int argc, char* argv[]) { if (argc < 5) { std::cerr << "Usage: " << argv[0] << " input.json output.txt zipcode [categories...]" << std::endl; return 1; } //load the arguments std::string inputFile = argv[1]; std::string outputFile = argv[2]; std::string zipcode = argv[3]; //read all categories from arguments std::vector searchCategories; for (int i = 4; i < argc; ++i) { searchCategories.push_back(argv[i]); } //open the input file std::ifstream inFile(inputFile.c_str()); if (!inFile) { std::cerr << "Error: Could not open input file: " << inputFile << std::endl; return 1; } //open the output file std::ofstream outFile(outputFile.c_str()); if (!outFile) { std::cerr << "Error: Could not open output file: " << outputFile << std::endl; return 1; } //read each line and create a Business object if it matches the zipcode and at least one search category std::list matchingBusinesses; std::string line; while (std::getline(inFile, line)) { Business biz(line); //check zipcode if (biz.getPostalCode() != zipcode) continue; //check categories: at least one category must be found bool categoryMatch = false; std::string bizCategories = biz.getCategories(); for (std::vector::const_iterator catIt = searchCategories.begin(); catIt != searchCategories.end(); ++catIt) { if (bizCategories.find(*catIt) != std::string::npos) { categoryMatch = true; break; } } if (categoryMatch) { matchingBusinesses.push_back(biz); } } //sort the list by rating in descending order matchingBusinesses.sort([](const Business &a, const Business &b) { return a.getRating() > b.getRating(); }); //output the results in a format similar to Yelp. if (matchingBusinesses.empty()) { outFile << "Sorry, we couldn't find any results" << std::endl; } else { int index = 1; for (std::list::const_iterator it = matchingBusinesses.begin(); it != matchingBusinesses.end(); ++it) { outFile << "=====================" << std::endl; //add line 1: Index and Business Name outFile << index << ". " << it->getName() << std::endl; //add line 2: Star rating, numeric rating, and review count outFile << it->getStarString() << " " << it->getRating() << " (" << it->getReviewCount() << " reviews)" << std::endl; //add line 3: City and then the price range (if available) outFile << it->getCity() << " "; if (it->getPrice() != -1) { for (int i = 0; i < it->getPrice(); ++i) outFile << "$"; } outFile << std::endl; //add line 4: Categories outFile << it->getCategories() << std::endl; index++; } outFile << "=====================" << std::endl; } return 0; }