عامل التحميل الزائد >> إلى المخزن المؤقت Char في C ++ - هل يمكنني معرفة طول الدفق؟

StackOverflow https://stackoverflow.com/questions/1686385

سؤال

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

لقد ذهب بسلاسة جدا حتى الآن؛ أريد الزائد المشغل >> أنه يمكنني القيام بأشياء مثل CIN >> My_String؛. المشكلة هي أنني لا أعرف كيفية قراءة ISTREAM بشكل صحيح (أو ربما المشكلة هي أنني لا أعرف التدفقات ...). لقد جربت بعض الوقت (! stream.eof ()) حلقة ذلك. قراءة () S 128 بايت في كل مرة، ولكن كما قد يتوقع المرء، فإنه يتوقف فقط عن eof فقط. أريد أن أقرأ إلى Newline، كما تحصل مع CIN >> إلى سلسلة STD ::

تحتوي فئة السلسلة الخاصة بي على وظيفة ALLOC (Size_T New_Size) التي تقوم (RE) بتخصيص الذاكرة، وظيفة إلحاق (const char *) التي تفعل ذلك الجزء هذا، ولكن من الواضح أنني بحاجة إلى معرفة مقدار الذاكرة لتخصيصها قبل أن أتمكن من الكتابة إلى متعادل.

أي نصيحة حول كيفية تنفيذ هذا؟ حاولت الحصول على طول ISTream مع Seekg () و Tellg ()، دون جدوى (إرجاع -1)، كما قلت حلقات حتى EOF (لا تتوقف عن القراءة في نيوليني) قراءة قطعة واحدة في وقت واحد.

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

المحلول

لقراءة الأحرف من الدفق حتى نهاية السطر استخدام حلقة.

char c;
while(istr.get(c) && c != '\n')
{
     // Apped 'c' to the end of your string.
}
// If you want to put the '\n' back onto the stream
// use istr.unget(c) here
// But I think its safe to say that dropping the '\n' is fine.

إذا نفدت الغرفة إعادة تخصيص المخزن المؤقت الخاص بك مع حجم أكبر. نسخ البيانات عبر ومتابعة. لا حاجة إلى أن تكون خيالية لمشروع التعلم.

نصائح أخرى

يمكنك استخدام CIN :: GetLine (المخزن المؤقت *، Buffer_Size)؛ ثم ستحتاج إلى التحقق من الأعلام السيئة، EOF وتفشل:

الأمراض المنقولة جنسيا :: CIN.BAD ()، الأمراض المنقولة جنسيا :: CIN.EOF ()، STD :: CIN.Fail ()

ما لم يتم تعيين سيئة أو EOF، فاخذ Fail Flag، عادة ما يشير إلى تجاوز تجاوز المخزن المؤقت، لذلك يجب عليك إعادة توجيه المخزن المؤقت الخاص بك ومتابعة القراءة في المخزن المؤقت الجديد بعد الاتصال STD :: CIN.Clear ()

ملاحظة جانبية: في STL، يتم تحميل المشغل >> من iststream لتوفير هذا النوع من الوظائف أو (أما بالنسبة ل * char) وظائف عالمية. ربما سيكون من الحكمة تقديم زائد مخصص بدلا من التحميل الزائد للمشغل في صفك.

تحقق إجابة جيري نعش على هذا سؤال.

الطريقة الأولى التي استخدمها بسيطة للغاية (مجرد فئة مساعد) وتتيح لك كتابة مدخلاتك في std::vector<std::string> حيث يمثل كل عنصر من عنصر المتجه خطا من المدخلات الأصلية.

هذا حقا يجعل الأمور سهلة عندما يتعلق الأمر بالمعالجة بعد ذلك!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top