سؤال

أحتاج إلى كتابة برنامج يقرأ إما من ifstream أو CIN، اعتمادا على المعلمات التي تم تمريرها إلى البرنامج في وقت التشغيل.

كنت أخطط للقيام بما يلي:

 istream in;

 if(argv[1] == "cin")
 {
      in = cin;
 }
 else
 {
      ifStream inFile;
      inFile.open(argv[1].c_str());
      in = inFile;
 }

ومع ذلك، ISTREAM في المحمية، ولا أستطيع أن أعلن Iststream. هل هناك طريقة لإعلان مثل هذا العام في الدفق؟

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

المحلول

حاول مع istream* في حين أن. ملاحظة، ومع ذلك، عليك تغيير الرمز الخاص بك قليلا. باستخدام المؤشرات عليك أن تحافظ على منطقة ذاكرة الكائن الذي توجهه. بمعنى آخر، لا يمكن الإعلان عن متغير "infile" هناك، لأنه لن يكون موجودا من آخر. يمكن أن يكون الرمز، ثم:

 istream* in;
 ifStream inFile;

 if(!strcmp(argv[1],"cin"))
 {
      in = &cin;
 }
 else
 {
      inFile.open(argv[1]);
      in = &inFile;
 }
 // use *in

(لاحظ أيضا التعديلات في معالجة السلسلة. قمت بتعديلها كمثال.)

نصائح أخرى

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

على سبيل المثال، بدلا من

program.exe cin

سوف تعمل فقط

program.exe

وبدلا من ذلك

program.exe myfile.txt

سوف تدير

program.exe < myfile.txt

هذا يعمل على * Nix و Windows.

يمكنك أيضا القيام بذلك دون المؤشرات:

ifStream inFile;
istream in( argv[1] == "cin" ? cin : inFile.open(argv[1]));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top