You need to enable JavaScript to run this app. C++如何从txt文件读取书籍数据并按用户筛选条件对比展示
优惠活动
大模型
产品
解决方案
定价
更多

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为例,逻辑如下:

  1. 根据用户选择的页数、价格选项,拿到对应的数值上下限
  2. 用ifstream打开对应分类的txt文件
  3. 逐行读取数据,拆分得到单本书的主题ID、页数、价格、书名
  4. 依次校验三个筛选条件:主题匹配、页数在区间内、价格在区间内
  5. 所有条件满足则输出该书籍信息

完整修改参考代码

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 12:24:08