الأمراض المنقولة جنسيا :: السلوك الغريب stringstream
سؤال
وبعض المعلومات الأساسية، لديرنج اضطررت لكتابة تدوين آلة حاسبة البولندية باستخدام شجرة ثنائية، لهذا العمل واضطررت الى تحليل المدخلات سطر الأوامر بحيث أنها ستبني صحيح شجرة ثنائية ومن ثم يذهب أكثر من ذلك لإعطاء إجابة صحيحة للتعبير رياضي التي تم إدخالها.
لإعراب أنا استخدم الأمراض المنقولة جنسيا :: stringstream لدرجة أنني سوف تكون قادرة بسهولة على تحويل الأمراض المنقولة جنسيا :: سلسلة وسلم I إلى تعويم صالح (أو صحيحة، انقر نقرا). وكانت القضية ركضت عبر التعليمة البرمجية التالية، والتي لديها خطأ عرضت وكيف تحل هذه القضية. وكنت آمل أن شخصا حيث ستكون قادرة على أن تخبرني إذا كنت تفعل شيئا خاطئا و.clear () غير صحيحة، أو إذا كان هذا هو خلل في المكتبة القياسية في الطريقة التي يعالج هذا مدخل معين (يحدث فقط ل+ و-)
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string mystring("+");
int num;
char op;
std::stringstream iss(mystring);
iss >> num;
// Seems it is not a number
if (iss.fail()) {
// This part does not work as you would expect it to
// We clear the error state of the stringstream
iss.clear();
std::cout << "iss fail bit: " << iss.fail() << std::endl;
iss.get(op);
std::cout << "op is: " << op << " iss is: " << iss.str() << std::endl;
std::cout << "iss fail bit: " << iss.fail() << std::endl;
// This however works as you would expect it to
std::stringstream oss(iss.str());
std::cout << "oss fail bit: " << oss.fail() << std::endl;
oss.get(op);
std::cout << "op is: " << op << " oss is: " << oss.str() << std::endl;
std::cout << "oss fail bit: " << oss.fail() << std::endl;
} else {
// We got a number
}
}
وإخراج نموذج من البرنامج:
iss fail bit: 0
op is: iss is: +
iss fail bit: 1
oss fail bit: 0
op is: + oss is: +
oss fail bit: 0
سوف وربما يا رفاق نرى شيئا فاتني، أو إذا كان هذا هو في الواقع أعلى خلل تصل إلى ما بعد برنامجي، التي مؤشرات الحالة إلى أين الإبلاغ عن هذا سيكون موضع تقدير كبير.
المحلول
وعندما تقول:
iss.clear();
std::cout << "iss fail bit: " << iss.fail() << std::endl;
iss.get(op);
وتحاول قراءة ما تم بالفعل قراءة. تحتاج إلى إعادة تعيين تيارات قراءة المؤشر:
iss.clear();
iss.seekg(0); // start again
std::cout << "iss fail bit: " << iss.fail() << std::endl;
iss.get(op);