के साथ NaN ASCII I/O Iostream और Visual C++ का उपयोग करके टेक्स्ट फ़ाइलों में से/NaN मानों को पढ़ना और लिखना चाहता हूं। एक NaN मान लिखते समय, मुझे 1.#QNAN
मिलता है। लेकिन, इसे वापस पढ़ने के लिए 1.0
आउटपुट।विजुअल सी ++
float nan = std::numeric_limits<float>::quiet_NaN();
std::ofstream os("output.txt");
os << nan ;
os.close();
उत्पादन 1.#QNAN
है।
std::ifstream is("output.txt");
is >> nan ;
is.close();
nan
1.0
बराबर होती है।
समाधान
अंत में, के रूप में awoodland ने सुझाव दिया, मैं इस समाधान के साथ आए हैं। मैंने एक नैन के स्ट्रिंग प्रस्तुति के रूप में "नैन" चुना है। < < और >> ऑपरेटर ओवरराइड हैं।
using namespace ::std;
class NaNStream
{
public:
NaNStream(ostream& _out, istream& _in):out(_out), in(_in){}
template<typename T>
const NaNStream& operator<<(const T& v) const {out << v;return *this;}
template<typename T>
const NaNStream& operator>>(T& v) const {in >> v;return *this;}
protected:
ostream& out;
istream& in;
};
// override << operator for float type
template <> const NaNStream& NaNStream::operator<<(const float& v) const
{
// test whether v is NaN
if(v == v)
out << v;
else
out << "nan";
return *this;
}
// override >> operator for float type
template <> const NaNStream& NaNStream::operator>>(float& v) const
{
if (in >> v)
return *this;
in.clear();
std::string str;
if (!(in >> str))
return *this;
if (str == "nan")
v = std::numeric_limits<float>::quiet_NaN();
else
in.setstate(std::ios::badbit); // Whoops, we've still "stolen" the string
return *this;
}
एक न्यूनतम कामकाजी उदाहरण: एक सीमित फ्लोट और एक नाएन स्ट्रिंगस्ट्रीम में लिखा जाता है और फिर वापस पढ़ा जाता है।
int main(int,char**)
{
std::stringstream ss;
NaNStream nis(ss, ss);
nis << 1.5f << std::numeric_limits<float>::quiet_NaN();
std::cout << ss.str() << std::endl; // OUTPUT : "1.5nan"
float a, b;
nis >> a; nis >> b;
std::cout << a << b << std::endl; // OUTPUT : "1.51.#QNAN"
}
सवाल होना चाहिए, "NaN के साथ स्वरूपित I/O कैसे करें"। मुझे लगता है। अच्छा प्रश्न। –
http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html कहता है 'यदि fprintf() फ़ंक्शन का परिवार अनंतता और NaN (फ़्लोटिंग-पॉइंट प्रारूप में एन्कोडेड एक प्रतीकात्मक इकाई) के लिए वर्ण स्ट्रिंग प्रस्तुतियों को उत्पन्न करता है आईईईई स्टडी 754-19 85 का समर्थन करें, fscanf() फ़ंक्शन के परिवार उन्हें इनपुट के रूप में पहचानेंगे। 'जो भी इसके लायक है। –
@Moo: यदि यह सच है, तो कम से कम हम अब जानते हैं कि iostreams 'fscanf' का उपयोग नहीं करते हैं :-) किसी भी मामले में जो भरोसेमंद चीज पर भरोसा करना होगा, क्योंकि NaN का पाठ प्रस्तुतिकरण कंपाइलर से भिन्न होता है कंपाइलर, और शायद राज्य से राज्य तक भी। शायद * ना * पढ़ने के लिए यह संभव नहीं है। (इसके बारे में सोचने के लिए यहां तक कि इसके लिए एक शाब्दिक भी नहीं है।) –