سؤال

أنت تعرف المصطلح الشائع stdio ذلك stdin تم تحديده بواسطة اسم ملف "-" ، على سبيل المثال

if ((strcmp(fname, "-"))
    fp = fopen(fname);
else
    fp = stdin;

ما هي أفضل طريقة للقيام بذلك مع ifstream نموذج؟ لقد تلقيت القليل من الكود الذي يحتوي على ifstream كجزء من الفصل وأرغب في إضافة رمز للقيام بما يعادله ، شيء مثل:

if ( filename == "-")
    logstream = cin;  // **how do I do this*?*
else
    logstream.open( filename.c_str() );
هل كانت مفيدة؟

المحلول

cin ليس ifstream, ، ولكن إذا كنت تستطيع الاستخدام istream بدلاً من ذلك ، فأنت في الفوز. خلاف ذلك ، إذا كنت على استعداد لتكون غير قابل للحمام ، فما عليك سوى فتح /dev/stdin أو /dev/fd/0 أو أيا كان. :-)


اذا أنت فعل تريد أن تكون محمولًا ، ويمكنها استخدام البرنامج istream, ، إليك طريقة واحدة للقيام بذلك:

struct noop {
    void operator()(...) const {}
};

// ...

shared_ptr<istream> input;
if (filename == "-")
    input.reset(&cin, noop());
else
    input.reset(new ifstream(filename.c_str()));

ال noop هو تحديد deleter لا يفعل شيئًا في cin الحالة ، لأن ، حسنا ، cin ليس من المفترض حذفه.

نصائح أخرى

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