मेरा कोड टेक्स्ट फ़ाइल Input_File_Name
से हस्ताक्षरित int चर को पढ़ता है।ifstream का उपयोग कर, फ़ाइल से सही ढंग से हस्ताक्षरित int चर को कैसे पढ़ा जाए?
unsigned int Column_Count; //Cols
unsigned int Row_Count;//Rows
try {
ifstream input_stream;
input_stream.open(Input_File_Name,ios_base::in);
if (input_stream) {
//if file is opened
input_stream.exceptions(ios::badbit | ios::failbit);
input_stream>>Row_Count;
input_stream>>Column_Count;
} else {
throw std::ios::failure("Can't open input file");
//cout << "Error: Can't open input file" << endl;
}
} catch (const ios::failure& error) {
cout << "Oh No!!" << error.what() << endl;
} catch (const exception& error) {
cout << error.what() <<"Oh No!!" << endl;
} catch (...) {
cout << "Unknown exception" << endl;
}
यह उत्कृष्ट काम करता है। लेकिन जब मैं एक गलत डेटा
33abcd4 567fg8
यह इस तरह से काम करता है के साथ पाठ फ़ाइल को भरने:
input_stream>>Row_Count; //Row_Count = 33;
input_stream>>Column_Count; // throws an ios::failure exception
क्यों नहीं इस लाइन input_stream>>Row_Count;
फेंक अपवाद? जैसा कि मैंने समझा, इनपुट_स्ट्रीम किसी भी गैर-संख्यात्मक प्रतीक को डेलीमीटर के रूप में मानता है, और अगले चरण पर यह "abcd" पढ़ने की कोशिश करता है। ऐसा है क्या? कैसे जबकि "33abcd4" पढ़ने सीमांकक कोड input_stream>>Row_Count;
की इस पंक्ति से एक ios::failure
अपवाद के रूप में एक अंतरिक्ष प्रतीक स्थापित करने के लिए?
iter_type do_get(iter_type, iter_type, ios_base&, ios_base::iostate&, T& v) const
जहां टी में से एक है:
#include <iostream>
#include <locale>
class my_num_get : public std::num_get<char> {
protected:
iter_type do_get(iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, unsigned int& v) const
{
in = std::num_get<char>::do_get(in, end, str, err, v);
if(in != end && !std::isspace(*in, str.getloc()))
err |= std::ios_base::failbit;
return in;
}
};
int main() {
using namespace std;
cin.imbue(std::locale(cin.getloc(), new my_num_get));
cin.exceptions(ios_base::badbit | ios_base::failbit);
try {
unsigned int x;
cin >> x;
} catch(const std::exception &e) {
cerr << e.what() << "\n";
}
}
आप इस अन्य प्रकारों के लिए भी काम करने के लिए चाहते हैं, तो एक ही तरह से निम्नलिखित को लागू:
यह सिर्फ 'ऑपरेटर >>' काम करता है; यह '33' निकालेगा और फिर रुक जाएगा, 'abcd' अगली कॉल के लिए 'ऑपरेटर >>' पर स्ट्रीम में रहता है। आप इसके बजाय एक स्ट्रिंग में '33abcd4' पढ़ सकते हैं और फिर इसमें गैर-संख्यात्मक वर्णों की जांच कर सकते हैं। साथ ही, यदि आपके पास हालिया कंपाइलर है जो C++ 11 का समर्थन करता है, तो जांचें कि मानक लाइब्रेरी 'std :: stoull' प्रदान करती है या नहीं। – jrok