C++ 如何将插入运算符与ifstream对象的共享\u ptr指针一起使用?

C++ 如何将插入运算符与ifstream对象的共享\u ptr指针一起使用?,c++,c++11,shared-ptr,ifstream,C++,C++11,Shared Ptr,Ifstream,我正在尝试使用共享的\u ptr指针读取文件。我不知道如何使用插入运算符。代码如下: #include <iostream> #include <regex> #include <fstream> #include <thread> #include <memory> #include <string> #include <map> using namespace std; int main() { s

我正在尝试使用共享的\u ptr指针读取文件。我不知道如何使用插入运算符。代码如下:

#include <iostream>
#include <regex>
#include <fstream>
#include <thread>
#include <memory>
#include <string>
#include <map>
using namespace std;

int main()
{
    string path="";    
    map<string, int> container;
    cout<<"Please Enter Your Files Path: ";
    getline(cin,path);

    shared_ptr<ifstream> file = make_shared<ifstream>();
    file->open(path,ifstream::in);
    string s="";
    while (file->good())
    {
        file>>s;
        container[s]++;
        s.clear();
    }

    cout <<"\nDone..."<< endl;
    return 0;
}
不起作用

如何获取文件指向的当前值我不想获取整行,我只需要通过这种方式获取单词及其出现次数


顺便说一句,我使用shared_ptr来避免自己关闭文件,不写文件->自己关闭是否就足够了?或者它们是无关的?

最简单的方法是使用解引用运算符*:

但是看看代码,我看不出有任何理由使用智能指针。您可以只使用ifstream对象


为什么你想让它成为一个指针?正是它让你痛苦

ifstream file;
file.open( ...
...
file>>s;
流被视为值类型而不是指针类型。在ifstream上调用析构函数时,文件将关闭

如果需要在代码的其他部分传递流对象,只需使用对基类的引用:

void other_fn( istream & f )
{
    string something;
    f>>something;
}

ifstream file;
other_fn( file );

因为f参数是一个引用,当它超出范围时,它不会尝试关闭流/文件-这仍然发生在定义原始ifstream对象的范围内。

为什么在ifstream文件上使用share_ptr?您知道,通过RAII,文件在离开范围时会自动关闭?是的,但是我认为将文件传递给多个函数是一个好主意,这样可以避免在不同的方法上声明多个ifstream对象。!我不知道这是否合理!如果这是一个愚蠢的决定,那么我将其删除。@Hossein—将流传递给其他函数/类的标准方法是通过对istream对象的引用传递—因此不需要复制。我认为将文件传递给多个函数是一个好主意,这样我就避免了在不同的方法上声明多个istream对象。!我不知道这是否合理!如果这是一个愚蠢的决定,那么我将删除它it@Hossein你可以将对文件的引用传递给你的函数。当函数结束,我们返回main时,会不会删除我的对象?@Hossein不,不会!通过引用阅读。
std::ifstream file(path); // opens file in input mode
ifstream file;
file.open( ...
...
file>>s;
void other_fn( istream & f )
{
    string something;
    f>>something;
}

ifstream file;
other_fn( file );