आप आमतौर पर वस्तु के प्रकार के लिए operator>>
अधिक भार के द्वारा इस करते हैं:
struct song_data {
std::string number;
std::string title;
std::string release_date;
// ...
};
std::istream &operator>>(std::istream &is, song_data &s_d) {
std::getline(is, s_d.number, '|');
std::getline(is, s_d.title, '|');
std::getline(is, s_d.release_date, '|');
std::string ignore;
std::getline(is, ignore, '|');
// ...
return is;
}
वहाँ अधिक क्षेत्र हैं के आधार पर आप की अनदेखी करने के (विशेष रूप से क्षेत्रों अनुगामी) चाहते हो सकता है यह कभी कभी के लिए और अधिक सुविधाजनक हो सकता है पूरी रेखा को एक स्ट्रिंग में पढ़ें, फिर उसे एक इष्टिंगस्ट्रीम में रखें, और वहां से अलग-अलग फ़ील्ड पार्स करें। विशेष रूप से, यह उन अतिरिक्त फ़ील्ड को पढ़ने से अतिरिक्त कार्य से बच सकता है जिनकी आप परवाह नहीं करते हैं, बल्कि जब आप जिन क्षेत्रों की परवाह करते हैं उन्हें बाहर निकाल दिया जाता है, तो बस अगली पंक्ति पर जाकर।
संपादित करें: मैं शायद std::vector<bool> genres;
जोड़कर और उस वेक्टर में 0 और 1 को पढ़कर शैलियों को संभालेगा। मैं तो एक गणन को निर्दिष्ट क्या शैली वेक्टर में किसी विशिष्ट स्थिति से दर्शाया जाता है जोड़ना होगा, तो (उदाहरण के लिए) का परीक्षण एक विशेष गीत के रूप में "देश" वर्गीकृत किया गया है कि क्या कुछ ऐसा दिखाई देगा:
enum { jazz, country, hiphop, classic_rock, progressive_rock, metal /*, ... */};
if (songs[i].genres[country])
if (songs[i].genres[hiphop])
process_hiphop(songs[i]);
बेशक , सटीक शैलियों और उनका आदेश कुछ ऐसा नहीं है जिसे मैं नहीं जानता, इसलिए मैंने कुछ संभावनाएं बनाई हैं - आपको (स्पष्ट रूप से) फ़ाइल प्रारूप के लिए परिभाषित शैलियों (और क्रम) का उपयोग करना होगा।
जहां तक सैकड़ों गाने चलते हैं, सामान्य तरीका (ऊपर उल्लिखित) कुछ ऐसा होगा: std::vector<song_data> songs;
। इसके बाद के संस्करण की तरह एक धारा निकासी का उपयोग करना, आप तो डेटा फ़ाइल से वेक्टर को कॉपी कर सकते हैं:
std::copy(std::istream_iterator<song_data>(infile),
std::istream_iterator<song_data>(),
std::back_inserter(songs));
आप मुख्य रूप से नाम से गाने को देखने के लिए की संभावना हो तो (एक उदाहरण के लिए), आप उपयोग करना पसंद कर सकते हैं std::map<std::string, song_data> songs
।इससे तरह कुछ करने के लिए कर देगा:
songs["new song"].release_date = Today;
पाया जा सकता है मैं कैसे जानते हो कि 1 और उदाहरण के लिए गीत शीर्षक एक-दूसरे से अलग हो गए हैं? – Edward
@Edward - प्रत्येक इनपुट लाइन को टोकन में पार्स करने के तरीके पर संपादित करें, जिनमें से प्रत्येक 'std :: string' है। यदि आपका इनपुट अच्छी तरह से गठित होने के लिए जाना जाता है तो आप टोकन को सीधे गीत संख्या 'int' और शैलियों के अपने' वेक्टर 'में रखने के लिए संशोधित कर सकते हैं। –