C ++: قم بتعيين CIN إلى متغير ifstream؟
سؤال
أنت تعرف المصطلح الشائع 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
ليس من المفترض حذفه.
نصائح أخرى
- حفظ الأولي Streambuf من سين في متغير
- غير ال Streambuf من سين إلى واحد من الملف.
- افعل ما تريد
- ولا تنسَ استعادة Cin Streambuf قبل إغلاق ملفك - قد يساعد Raii.
لا تنتمي إلى StackOverflow