0

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

単に行う:

file>>s;

動作しません。

ファイルが指している現在の値を取得するにはどうすればよいですか (行全体を取得したくありません。この方法で単語とその出現回数を取得する必要があるだけです)。

ちなみに、私は自分でファイルを閉じないように shared_ptr を使用しましたが、この型のポインタを作成することで、 shared_ptr (スマート) はfile->close()自分自身を書かなくても十分でしょうか? またはそれらは無関係ですか?

4

2 に答える 2

4

最も簡単な方法は、逆参照を使用することoperator *です。

(*file) >> s;

しかし、コードを見ると、スマート ポインターを使用する理由がまったくわかりません。ifstreamオブジェクトを使用するだけです。

std::ifstream file(path); // opens file in input mode
于 2013-07-20T07:24:58.433 に答える
3

なぜポインタにしたいのですか?それがあなたを苦しめているのです。

ifstream file;
file.open( ...
...
file>>s;

ストリームは、(ポインター型ではなく) 値として扱われることを意図しています。でデストラクタが呼び出されると、ファイルは閉じられますifstream

ストリーム オブジェクトをコードの他の部分に渡す必要がある場合は、(基本クラスへの) 参照を使用するだけです。

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

ifstream file;
other_fn( file );

パラメータは参照であるため、スコープ外に出たときにストリーム/ファイルを閉じようとはしません。これは、元のオブジェクトfを定義するスコープ内で引き続き発生します。ifstream

于 2013-07-20T07:25:05.240 に答える