سؤال

عندما أحاول تجميع التعليمات البرمجية

istream in;
if (argc==1)
        in=cin;
else
{
        ifstream ifn(argv[1]);
        in=ifn;
}

فشل دول مجلس التعاون الخليجي، يشكو ذلك operator= هو خاص. هل هناك أي طريقة لتعيين istream لقيم مختلفة بناء على حالة؟

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

المحلول

يمكنك استبدال Streambuf CIN مع آخر، وفي بعض البرامج أبسط من الاستراتيجية العامة للتمرير حول ISTreams دون الرجوع إلى CIN مباشرة.

int main(int argc, char* argv[]) {
  ifstream input;
  streambuf* orig_cin = 0;
  if (argc >= 2) {
    input.open(argv[1]);
    if (!input) return 1;
    orig_cin = cin.rdbuf(input.rdbuf());
    cin.tie(0); // tied to cout by default
  }

  try {
    // normal program using cin
  }
  catch (...) {
    if (orig_cin) cin.rdbuf(orig_cin);
    throw;
  }

  return 0;
}

على الرغم من أن الأمر نادرا للغاية لاستخدام CIN بعد أن يترك السيطرة الرئيسية، فإن Try-Catch أعلاه يتجنب السلوك غير المحدد إذا كان هذا شيء قد يقوم به برنامجك.

نصائح أخرى

يمكنك استخدام مؤشر ل in, ، على سبيل المثال:

istream *in;
ifstream ifn;

if (argc==1) {
     in=&cin;
} else {
     ifn.open(argv[1]);
     in=&ifn;
}

لذلك، هل لا يشكو "لا يوجد منشئ مناسب متاح"؟ على أي حال، يمكنك تعديلها على النحو التالي.

void Read(istream& is)
{
    string line;
    while (getline(is, line))
        cout << line;
}

int main(int argc, char* argv[])
{
    if (argc == 1)
        Read(cin);
    else
    {
        ifstream in("sample.txt");
        Read(in);
    }
}

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

#include <fstream>
#include <istream>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
  istream *in;
  // Must be declared here for scope reasons
  ifstream ifn;

  // No argument, use cin
  if (argc == 1) in = &cin;
  // Argument given, open the file and use it
  else {
    ifn.open(argv[1]);
    in = &ifn;
  }
  return 0;

  // You can now use 'in'
  // ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top