从cin或文件中读取

m42*_*42a 6 c++ istream

当我尝试编译代码时

istream in;
if (argc==1)
        in=cin;
else
{
        ifstream ifn(argv[1]);
        in=ifn;
}
Run Code Online (Sandbox Code Playgroud)

gcc失败了,抱怨operator=是私密的.有没有办法istream根据条件设置不同的值?

dmc*_*cer 5

您可以使用指针in,例如:

istream *in;
ifstream ifn;

if (argc==1) {
     in=&cin;
} else {
     ifn.open(argv[1]);
     in=&ifn;
}
Run Code Online (Sandbox Code Playgroud)


小智 4

您可以用另一个替换 cin 的streambuf,在某些程序中,这比传递 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;
}
Run Code Online (Sandbox Code Playgroud)

尽管在控制离开 main 后使用 cin 的情况极为罕见,但如果您的程序可能会执行此操作,则上述 try-catch 可以避免未定义的行为。