पर अपवाद मैंने हाल ही में सीखा है कि कोई iostreams के लिए अपवादों में ऑप्ट-इन कर सकता है। आदेश में मैन्युअल रूप से जाँच करने के लिए अगर एक फ़ाइल खुला मुझे लगता है कि कोशिश की और इस व्यवहार में भाग है नहीं करने के लिए:iostreams
#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <vector>
void test(std::istream& is, bool exceptions) {
try {
if (exceptions)
is.exceptions(std::istream::failbit);
std::vector<int> input;
std::copy(std::istream_iterator<int>{is}, {}, std::back_inserter(input));
for (auto x : input) {
std::cout << x << '\n';
}
}
catch (const std::ios_base::failure& f) {
std::cerr << "Caught error: " << f.what() << '\n';
}
}
int main() {
// Emulates file
std::stringstream ss("1 2 3\n4 5 6\n7 8 9\n");
test(ss, true);
}
जब अपवाद बंद सेट कर रहे हैं यह सामान्य रूप से काम करता है। लेकिन जब मैं अपवादों का उपयोग करता हूं तो मुझे basic_ios::clear
से फेंक दिया जाता है और मैं एक कारण के बारे में नहीं सोच सकता।
basic_ios::clear
समारोह cppreference के अनुसार failbit
सेट कर सकते हैं कि के तहत सूचीबद्ध नहीं है।
अग्रिम धन्यवाद।
संपादित करें: नीचे दिए गए उत्तर पहले से ही जवाब देते हैं कि ऐसा क्यों होता है। मेरा अतिरिक्त सवाल यह है कि इस अपवाद से कैसे बचें? मेरे दूसरे प्रयास इस पाश से std::copy
को बदलने के लिए किया गया था:
for (int n; is >> n;) {
input.push_back(n);
}
एक ही अपवाद का उत्पादन किया। या यह व्यवहार भी इरादा है?
नोट: क्लैंग इस व्यवहार को नहीं दिखाता है।
'basic_ios :: clear' निम्नतम स्तर की प्रविष्टि है जो Iostate सेट करता है। अन्य कार्यों में 'basic_ios :: clear' को कॉल करके विफलता/बैडबिट/eofbit सेट करें। – cpplearner
@cpplearner: यह स्पष्ट करने के लिए धन्यवाद। मुझे अभी भी पता नहीं है कि उपरोक्त स्निपेट किसी भी अपवाद को क्यों फेंकता है। – sv90