C++如何从txt文件读取书籍数据并按用户筛选条件对比展示
C++ 书籍筛选功能实现指导
前置优化点
- 调整文件存储格式:原有的拼接式文本不方便解析,建议将每条书籍数据用固定分隔符(如
|)拆分字段,统一结构为主题ID|页数|价格|书名,比如现代经典第一条数据存储为4|50|6|Mecburiyet(Stefan Zweig),其中4对应Dram主题,读取时直接拆分即可拿到数值维度的筛选依据,无需复杂字符串提取。 - 补充缺失字段:现有代码中主题字段为空、世界经典分类的价格字段未填写,需要补全后筛选逻辑才能正常运行。
- 预定义区间映射:将用户选择的选项编号映射为实际数值区间,方便后续判断:
// 页数区间映射,下标对应用户输入的选项1-6 pair<int, int> page_range[] = {{0,0}, {0,50}, {51,100}, {101,200}, {201,300}, {401,500}, {501,9999}}; // 价格区间映射,下标对应用户输入的选项1-6 pair<int, int> price_range[] = {{0,0}, {0,10}, {11,20}, {21,50}, {51,75}, {76,100}, {101,9999}};
核心筛选逻辑实现
在每个分类类中添加筛选方法,以ModernKlasik为例,逻辑如下:
- 根据用户选择的页数、价格选项,拿到对应的数值上下限
- 用
ifstream打开对应分类的txt文件 - 逐行读取数据,拆分得到单本书的主题ID、页数、价格、书名
- 依次校验三个筛选条件:主题匹配、页数在区间内、价格在区间内
- 所有条件满足则输出该书籍信息
完整修改参考代码
#include <iostream> #include <fstream> #include <string> #include <vector> #include <utility> using namespace std; // 全局区间映射 pair<int, int> page_range[] = {{0,0}, {0,50}, {51,100}, {101,200}, {201,300}, {401,500}, {501,9999}}; pair<int, int> price_range[] = {{0,0}, {0,10}, {11,20}, {21,50}, {51,75}, {76,100}, {101,9999}}; // 字符串分割工具函数 vector<string> split(const string& s, const string& delimiter) { vector<string> tokens; size_t pos = 0; size_t prev = 0; while ((pos = s.find(delimiter, prev)) != string::npos) { tokens.push_back(s.substr(prev, pos - prev)); prev = pos + delimiter.length(); } tokens.push_back(s.substr(prev)); return tokens; } class BookShop{ protected: int usertema; int userfiyat; int usersayfaaraligi; public: int tur; void Karsilama(){ cout<<"Hosgeldiniz secmek istediginiz türü seciniz"<<endl; cout<<"1:modern klasik \n 2:Turkedebiyati \n 3:Dunyaklasigi"<<endl; cin>>tur; } }; class ModernKlasik:public BookShop{ public: ModernKlasik() { cout<<"Aradiginiz kitap temasi nedir?"; cout<<"\n1:Korku\n2:Aşk\n3:Sevgi\n4:Dram\n5:Kahramanlık\n"; cin>>usertema; cout<<"Sayfa sayisi?:"; cout<<"\n1:[0-50]\n2:[50-100]\n3:[100-200]\n4:[200-300]\n5:[400-500]\n6:[500+]"<<endl; cin>>usersayfaaraligi; cout<<"Fiyat araligi?:"; cout<<"\n1:[0-10]TL\n2:[10-20]TL\n3:[20-50]TL\n4:[50-75]TL\n5:[75-100]TL\n6:[100+]TL"<<endl; cin>>userfiyat; } // 写入文件方法(已调整存储格式) void saveBooks(){ ofstream myFile1("Modernklasik.txt"); // 存储格式:主题ID|页数|价格|书名 myFile1<<"4|50|6|Mecburiyet(Stefan Zweig)"<<endl; myFile1<<"2|70|8|Feniçka(Lou Andreas-Salome)"<<endl; myFile1<<"3|74|8|Ayışığı Sokağı(Stefan Zweig)"<<endl; myFile1<<"5|108|11|Vahşetin Çağrısı(Jack London)"<<endl; myFile1<<"4|150|20|Hayvan Çiftliği(George Orwell)"<<endl; myFile1<<"4|256|15|Karmaşık Duygular(Stefan Zweig)"<<endl; myFile1.close(); } // 筛选并输出符合条件的书籍 void filterBooks() { ifstream file("Modernklasik.txt"); string line; int page_min = page_range[usersayfaaraligi].first; int page_max = page_range[usersayfaaraligi].second; int price_min = price_range[userfiyat].first; int price_max = price_range[userfiyat].second; cout << "\n符合条件的书籍如下:" << endl; while (getline(file, line)) { if (line.empty()) continue; vector<string> info = split(line, "|"); int tema = stoi(info[0]); int page = stoi(info[1]); int price = stoi(info[2]); string name = info[3]; // 条件匹配判断 if (tema == usertema && page >= page_min && page <= page_max && price >= price_min && price <= price_max) { cout << name << " 页数:" << page << " 价格:" << price << "TL" << endl; } } file.close(); } }; // Turkedebiyati、Dunyaklasikleri类参考ModernKlasik修改即可,仅存储的书籍数据不同 class Turkedebiyati:public BookShop{ public: Turkedebiyati() { cout<<"Aradiginiz kitap temasi nedir?"; cout<<"\n1:Korku\n2:Aşk\n3:Sevgi\n4:Dram\n5:Kahramanlık\n"; cin>>usertema; cout<<"Sayfa sayisi?:"; cout<<"\n1:[0-50]\n2:[50-100]\n3:[100-200]\n4:[200-300]\n5:[400-500]\n6:[500+]"<<endl; cin>>usersayfaaraligi; cout<<"Fiyat araligi?:"; cout<<"\n1:[0-10]TL\n2:[10-20]TL\n3:[20-50]TL\n4:[50-75]TL\n5:[75-100]TL\n6:[100+]TL"<<endl; cin>>userfiyat; } void saveBooks(){ ofstream myFile2 ("Turkedebiyati.txt"); myFile2<<"4|409|20|Çalıkuşu(Reşatnuri Gültekin)"<<endl; myFile2<<"2|164|5|Kürk Mantolu Madonna(Sabahattin Ali)"<<endl; myFile2<<"4|112|8|Dokuzuncu Hariciye Koğusu(Peyami Safa)"<<endl; myFile2<<"5|112|5|Vatan Yahut Silistre(Namik Kemal)"<<endl; myFile2<<"4|300|10|Eylül(Mehmet Rauf)"<<endl; myFile2<<"2|195|12|Kırmızı Sacli Kadin(Orhan Pamuk)"<<endl; myFile2.close(); } void filterBooks() { ifstream file("Turkedebiyati.txt"); string line; int page_min = page_range[usersayfaaraligi].first; int page_max = page_range[usersayfaaraligi].second; int price_min = price_range[userfiyat].first; int price_max = price_range[userfiyat].second; cout << "\n符合条件的书籍如下:" << endl; while (getline(file, line)) { if (line.empty()) continue; vector<string> info = split(line, "|"); int tema = stoi(info[0]); int page = stoi(info[1]); int price = stoi(info[2]); string name = info[3]; if (tema == usertema && page >= page_min && page <= page_max && price >= price_min && price <= price_max) { cout << name << " 页数:" << page << " 价格:" << price << "TL" << endl; } } file.close(); } }; class Dunyaklasikleri:public BookShop{ public: Dunyaklasikleri() { cout<<"Aradiginiz kitap temasi nedir?"; cout<<"\n1:Korku\n2:Aşk\n3:Sevgi\n4:Dram\n5:Kahramanlık\n"; cin>>usertema; cout<<"Sayfa sayisi?:"; cout<<"\n1:[0-50]\n2:[50-100]\n3:[100-200]\n4:[200-300]\n5:[400-500]\n6:[500+]"<<endl; cin>>usersayfaaraligi; cout<<"Fiyat araligi?:"; cout<<"\n1:[0-10]TL\n2:[10-20]TL\n3:[20-50]TL\n4:[50-75]TL\n5:[75-100]TL\n6:[100+]TL"<<endl; cin>>userfiyat; } void saveBooks(){ ofstream myFile3 ("Dunyaklasikleri.txt"); // 已补全价格和主题ID myFile3<<"4|592|45|Suç ve Ceza(Dostoyevski)"<<endl; myFile3<<"4|393|60|Savaş ve Barış(Tolstoy)"<<endl; myFile3<<"5|464|42|İki şehrin hikayesi(Charles Dickens)"<<endl; myFile3<<"4|184|28|İnsancıklar(Dostoyevski)"<<endl; myFile3<<"3|128|18|Fareler ve İnsanlar(John Steinbeck)"<<endl; myFile3<<"2|240|15|Romeo ve Juliet(William Shakespeare)"<<endl; myFile3.close(); } void filterBooks() { ifstream file("Dunyaklasikleri.txt"); string line; int page_min = page_range[usersayfaaraligi].first; int page_max = page_range[usersayfaaraligi].second; int price_min = price_range[userfiyat].first; int price_max = price_range[userfiyat].second; cout << "\n符合条件的书籍如下:" << endl; while (getline(file, line)) { if (line.empty()) continue; vector<string> info = split(line, "|"); int tema = stoi(info[0]); int page = stoi(info[1]); int price = stoi(info[2]); string name = info[3]; if (tema == usertema && page >= page_min && page <= page_max && price >= price_min && price <= price_max) { cout << name << " 页数:" << page << " 价格:" << price << "TL" << endl; } } file.close(); } }; int main() { BookShop b1; b1.Karsilama(); if(b1.tur==1) { ModernKlasik m1; m1.saveBooks(); m1.filterBooks(); } if(b1.tur==2) { Turkedebiyati t1; t1.saveBooks(); t1.filterBooks(); } if(b1.tur==3) { Dunyaklasikleri d1; d1.saveBooks(); d1.filterBooks(); } return 0; }
内容的提问来源于stack exchange,提问作者Gökhan
相关产品推荐
相关产品推荐

