Frage

Wenn ich versuche, den Code zu kompilieren

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

GCC scheitert und beschwert sich das operator= ist privat. Gibt es eine Möglichkeit, eine festzulegen? istream zu unterschiedlichen Werten basierend auf einer Bedingung?

War es hilfreich?

Lösung

Sie können den Streambuf von Cin durch ein anderes ersetzen, und in einigen Programmen ist dies einfacher als die allgemeine Strategie, Istreams umzugeben, ohne sich direkt auf CIN zu beziehen.

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;
}

Obwohl es äußerst selten ist, CIN nach dem Kontrollverlust der Main zu verwenden, vermeidet das obige Versuch undefinedes Verhalten, wenn dies etwas ist, das Ihr Programm möglicherweise tut.

Andere Tipps

Sie könnten einen Zeiger für verwenden in, z.B:

istream *in;
ifstream ifn;

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

Beklagt es sich also nicht "kein geeigneter Konstruktor verfügbar"? Wie auch immer, Sie können es wie unten ändern.

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);
    }
}

Sie können solche Streams nicht beeinflussen. Was Sie erreichen möchten, kann jedoch mit einem Zeiger auf einen iStream erhalten werden.

#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'
  // ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top