使用运算符>> 与指向 ifstream 对象的指针

Using operator>> with a pointer to ifstream object

本文关键字:gt ifstream 对象 指针 运算符      更新时间:2023-10-16

为什么在下面的代码中指令os->operator>> input是错误的?操作符>>的返回值不是对象*os吗?

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
  double input;
  ifstream * os = new ifstream("prova.dat");
  os->operator>> input;
  return 0;
}

当您想使用>>作为方法时,那么您需要像普通函数一样通过()传递参数。要取消引用它,您应该使用以下两种方法:

os->operator >> (input);

*os >> input;

注意:当你可以使用自动对象或引用时,为什么使用指针呢?此外,您需要管理分配的对象并释放它。

如果你这样创建指向流的指针,你可能做错了什么。

这应该可以正常工作:

int main()
{
  double input;
  std::ifstream os("prova.dat");
  os >> input;
  return 0;
}

因为ifstream是在堆栈上分配的,所以当函数结束时它将被自动清理,这将关闭底层文件句柄。你错过了显式的delete,你需要在你的代码中做同样的事情。

如果你需要传递你的流,你可以通过引用:

double read_double(std::ifstream& stream)
{
  double d;
  stream >> d;
  return d;
}
int main()
{
  std::ifstream os("prova.dat");
  double input = read_double(os);
  return 0;
}