मैं सी ++ फ़ाइल हैंडलिंग में एक प्रोजेक्ट पर काम कर रहा हूं और इस बग को ठीक करने के लिए पहले से ही काफी समय बिता रहा हूं लेकिन असफल रहा और मदद की तलाश में हूं।

यहाँ मेरी .txt फ़ाइल है

SNO, Name, NoOfPeopleLiked
1, The Shawshank Redemption, 77 
2, The Godfather, 20        
3, Into The Wild, 35
4, The Dark Knight, 55      
5, 12 Angry Men, 44
6, Schindler's List, 33
7, The Lord of the Rings: The Return of the King, 25
8, Pulp Fiction, 23
9, The Good, the Bad and the Ugly, 33   
10, The Lord of the Rings: The Fellowship of the Ring, 56
11, Lucifer, 1
12, 50 Shades of Grey, 1

मैं NoOfPeopleLiked के संबंध में शीर्ष 5 रेटेड फिल्में दिखाना चाहता हूं और यह पूरी तरह से काम करता है जब एक फ़ाइल में केवल 10 फिल्में होती हैं। लेकिन जब भी मैं किसी फ़ाइल में और फिल्में जोड़ता हूं तो यह दिखाता है कि Project Movies Management System.exe ने एक ब्रेकपॉइंट ट्रिगर किया है और फिर मेरा कंपाइलर यह if (_Result) { _STL_VERIFY(!_Pred(_Right, _Left), "invalid comparator"); }(BreakPoint) दिखाता है।

कोड:

int movieRating()
    {
        try {
            auto StrTrim = [](string& str) {
                str.erase(0, str.find_first_not_of("\t\n\v\f\r ")); // left trim
                str.erase(str.find_last_not_of("\t\n\v\f\r ") + 1); // right trim
            };
            ifstream ifile("movies.txt");
            //string line;
            vector<string> lines;
            // Read all lines of file.
            while (getline(ifile, line)) {
                StrTrim(line);
                if (line.empty())
                    continue;
                lines.push_back(line);
            }
            if (!lines.empty())
                lines.erase(lines.begin(), lines.begin() + 1); // remove first header line
            vector<tuple<size_t, string, size_t>> data;
            regex re(R"((\d+)\s*,\s*(.+)?\s*,\s*(\d+))");
            for (auto const& line : lines) {
                smatch matches;
                if (regex_match(line, matches, re)) {
                    if (matches.size() != 4)
                        throw runtime_error("Matched line with not 3 elements: '" + line + "'!");
                    data.push_back(make_tuple(size_t(stoi(matches[1])), matches[2], size_t(stoi(matches[3]))));
                }
                else
                    throw runtime_error("Unmatched line: '" + line + "'!");
            }
            sort(data.begin(), data.end(), [](auto const& l, auto const& r) {
                return get<2>(l) >= get<2>(r);
                });
            int sum = 0;
            for (size_t i = 0; i < 5; ++i) {
                if (i >= data.size())
                    break;
                cout << (i + 1) << ", " << get<1>(data[i]) << ", " << get<2>(data[i]) << endl;
                sum = sum + get<2>(data[i]);
            }
            cout << "\n---------------------------------------------------------------------------" << endl;
            cout << "\nThe total number of people who have already rated the movies is : " << sum << endl;
        }
        catch (exception const& ex) {
            cout << "Exception: " << ex.what() << endl;
            return -1;
        }
    }

संक्षेप में, मैं NoOfPeopleLiked के संबंध में शीर्ष 5 फिल्में प्रदर्शित करना चाहता हूं, मेरा कोड फ़ाइल में केवल पहली 10 फिल्मों के लिए पूरी तरह से काम करता है और जब भी फिल्में 10 से अधिक होती हैं तो अपवाद फेंकता है।

-1
Linear Data Structure 27 पद 2020, 16:15

1 उत्तर

सबसे बढ़िया उत्तर

यदि पहले आइटम को दूसरे आइटम से पहले सॉर्ट किया जाना है और अन्यथा असत्य है, तो तुलनित्र को सही लौटना चाहिए। इसका तात्पर्य यह है कि तुलनित्र को बराबर आइटम के लिए झूठी वापसी करनी होगी। आपका तुलनित्र ऐसा नहीं करता है

return get<2>(l) >= get<2>(r);

इसमें बदलें

return get<2>(l) > get<2>(r);

आपके पास वास्तव में काफी उपयोगी त्रुटि संदेश था।

1
john 27 पद 2020, 16:27
बस ध्यान दिया कि आपको वह कोड पिछले SO उत्तर से मिला है। ओह ठीक है, मैंने वहां भी एक टिप्पणी जोड़ दी है।
 – 
john
27 पद 2020, 16:38
यह आप की तरह है @ जॉन। मदद के लिए धन्यवाद
 – 
Linear Data Structure
27 पद 2020, 16:40