2017-09-18 1 views
1

ファイルを読み込み、保護された変数に格納しようとしています。すべてのメソッドは同じクラスにあります。ファイルを読み込み、C++で保護された変数に格納します

class A: public B 
{ 
    public: 
    //method declarations 
    protected: 
    string d; 
}; 

void A::l(std::string filename) 
{ 
    ifstream ifs; 
    ifs.open(filename); 
    string d { istreambuf_iterator<char> {ifs}, istreambuf_iterator<char> {} }; 
    ifs.close(); 
} 

void A::f(void) 
{ 
    std::cout << d.length() << std::endl; 
} 

私は、文字列の長さを印刷しようとすると、私は(Fでdを印刷しようとすると、それは)0ですが、何も印刷されません。私はdが保護された変数である必要があり、その方法も変更できません。読み込みファイルの文字列をfメソッドに渡すにはどうすればよいですか?それでも解決しない場合、あなたはおそらく間違ったファイル名を指定している

this->d.assign(istreambuf_iterator<char> {ifs}, {}); 

+2

あなたのメンバ 'string d'ではなく、' A :: l() 'メソッドの中のローカル'文字列d 'に保存します。 –

答えて

1

あなたがローカルに割り当てられたが、メンバーを(this->がここにオプションである)を使用します。

絶対パス(例:/home/user/file.txtまたはC:\ Documents \ User \ Documents \ file.txt)またはを使用して、プログラムの作業ディレクトリを確認してください。

あなたは常にエラーをチェックすることができます

if (!ifs) throw std::runtime_error("File could not be opened"); 
+0

'l'メソッドでファイルの内容を正しく読み取ることができました。 'd'変数に読み込まれて格納されます。しかし、 'f'でアクセスしようとすると、' d'の長さは0になります。 – Misha

+0

これを追加しました。その部分を最初に紛失して申し訳ありません – sehe

+0

これを追加する - >働いた。ありがとうございました! – Misha

0

あなたの問題は、あなたの変数が保護されているという事実とは何の関係もありません。問題は、同じ名前の別の変数を定義していることです。この問題を避けるために、変数の名前に 'd_'のようにアンダースコアを追加する人もいれば、他の人が 'm_d'と書くこともできます。しかし、あなたがしたくなければ、それをする必要はありません。あなたがやりたいために

一つの方法は以下の通りです:

class A 
{ 
    public: 
    void l(std::string filename); 
    void f(); 

//method declarations 
protected: 
string d; 

};

void A::l(std::string filename) 
{ 
    ifstream ifs{filename}; 
    if(!ifs) 
     return; // error 

    std::copy(istreambuf_iterator<char>{ifs}, 
     istreambuf_iterator<char>{}, 
     std::back_inserter(d)); // this is A::d 

} 

「this->」を使用する必要はありません。実際にはC++では 'this'を使用しません( 'return * this'のような文でのみ)。

また、Cであなたが書いていない++:

void f(void); 

を代わりに、あなたは

void f(); 

を書いても、あなたははifstreamを閉じる必要はありません。デストラクタはあなたのためにそれを行うつもりです。

関連する問題