سؤال

ولقد تم تحاول استخدام C ++ الطبقة stringstream للقيام ببعض التلاعب سلسلة بسيطة نسبيا، ولكن أواجه مشكلة مع طريقة الحصول على (). لسبب ما كلما استخراج الطابع الناتج بحرف فإنه يلحق نسخة ثانية من الرسالة النهائي.

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(!ss.eof()) {
      ss.get(c);
      cout << "char: " << c << endl;
   }
   return 0;
}

والإخراج من البرنامج هو:

char: h
char: e
char: l
char: l
char: o
char: o

وأي مساعدة يمكن أن تعطيني على هذا سيكون موضع تقدير.

هل كانت مفيدة؟

المحلول

وفي نهاية ss.eof() تيار لا نعرف حتى الآن أن نهاية مجرى سيتم التوصل في وقت قريب، ولكن فشل استخراج التالية حرف. منذ فشل استخراج لأنه كان الوصول إلى نهاية للتيار، لا يتم تغيير c. البرنامج لا تعترف بأن ss.get(c) فشل ويطبع تلك القيمة القديمة c مرة أخرى.

وهناك طريقة أفضل لمعرفة ما اذا كان هناك لا يزال حرف التي يمكن قراءتها من تيار سيكون حلقة من هذا القبيل:

while (ss.get(c)) {
   cout << "char: " << c << endl;
}

نصائح أخرى

ولأن لها من أجل من الحلقة. القراءة الخاص بك \ 0 وEOF.

وإعادة ترتيب التعليمات البرمجية الخاصة بك مثل هذا

int main() {
   stringstream ss("hello");
   char c;

   ss.get(c);
   while(!ss.eof()) {
      cout << "char: " << c << endl;
      ss.get(c);
   }
   return 0;
}

ويتم تعيين العلم EOF فقط إذا حاولت القراءة بعد نهاية الملف. وفيما يلي إصلاحات رمز المشكلة عن طريق اختبار لEOF بعد الحصول على () بدلا من قبل:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
   stringstream ss("hello");
   char c;

   while(1) {
      ss.get(c);
      if(ss.eof())
          break;

      cout << "char: " << c << endl;
   }
   return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top