Читайте из cin или файла

Когда я пытаюсь скомпилировать код

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

сбои gcc, жалуясь это operator= является частным. Есть ли любой способ установить istream к различным значениям на основе условия?

6
задан m42a 9 March 2010 в 06:35
поделиться

4 ответа

Вы можете заменить 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 после выхода управления из main крайне редко, приведенная выше try-catch позволяет избежать неопределенного поведения, если это то, что может сделать ваша программа.

4
ответ дан 8 December 2019 в 17:20
поделиться

Итак, он не жалуется, что "нет подходящего конструктора"? В любом случае, вы можете изменить его, как показано ниже.

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);
    }
}
4
ответ дан 8 December 2019 в 17:20
поделиться

Вы не можете влиять на потоки таким образом. Однако то, чего вы хотите достичь, можно получить с помощью указателя на 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'
  // ...
}
1
ответ дан 8 December 2019 в 17:20
поделиться

Вы можете использовать указатель для в, например:

istream *in;
ifstream ifn;

if (argc==1) {
     in=&cin;
} else {
     ifn.open(argv[1]);
     in=&ifn;
}
5
ответ дан 8 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: