2017-03-10 11 views
-1

コンストラクタが行うべきサイズがobjectのtxtファイルを読み込むコンストラクタを持つ次のクラスがあります。次に、コンストラクタがどこで停止したのかを調べるために関数read()が必要ですが、何らかの理由でファイルの先頭から再び開始します。これはどのように修正されましたか?メンバー関数内のコンストラクタから変数を使用する

class Reader { 
public: 
    Reader(const char* file): _file(file) { 
     _ptr = 0; 
     ifstream _file(file); 

     _file >> word; 
     if(word!="BEGIN") { 
      //Raise error. 
     } 

     _file >> word; //Reads in next word. 
     if(word=="SIZE") { 
      _file >> size_x; 
      _file >> size_y; 

      _ptr = new Object(size_x,size_y); 
     } 
     else { 
      //Raise error. 
     } 

     _file >> word; 

     while(word=="POSITION") { 
      int readoutID; 
      int ix; 
      int iy; 
      _file >> readoutID >> ix >> iy; 

      //Set ID to position 

      _file >> word; 
     } 

     std::cout << "End of definition: " << word << std::endl; 
    } 

    bool read(){ 
     std::cout << word << std::endl; // This word should be the one where the constructor stopped. 
    //Returns False at the end if file. 
    } 

private: 
    Object* _ptr; 
    std::ifstream _file; 
    std::string word; 

私の主なファイルは次のようになります。

int main(){ 

Reader r("file.dat"); 

while(r.read()) { 
//Function that prints out the values of read() 
} 

} 
+1

'_file'はステートフルです。自動的に読み込むためにコンストラクタが停止した場所を続ける必要があります。それはあなたのために働かないのですか? –

+0

どのように 'read()'を呼びますか?そしてあなたのコンストラクタと何が関係しているのですか? – xander

+0

私は最初にクラス 'Reader'のオブジェクトを作成した後、' read() '関数を呼び出す小さなメインファイルを持っています。編集を参照してください。 –

答えて

0

あなたの質問から私はコンストラクターが停止した場所をピックアップするために)(関数は読ん必要がありますが、何らかの理由での最上部から始まりますthis->_fileを使用せず、ローカル変数_fileを作成します。したがって、this->_fileの状態は、開いたときと同じです:ファイルの先頭。

また、コンストラクタの名前が正しくない(ReaderではなくCaloReader)。

CaloReader(const char* file): _file(file) { 
    _ptr = 0; 
    ifstream _file(file); // local variable 
    _file >> word; 
+0

'this - > _ file'をどうすれば正確に使うことができますか? –

+0

C++を習っていますか? 'this - > _ file'は単純に_file属性を使用していることを示しています。変数の宣言を単に削除することもできます(私の答えに示されているように)。しかし、あなたの必要性を見て、コンストラクタの外の単語を読むコードを移動する必要があります:それはreadメソッドで行わなければなりません。 – NoDataFound

関連する問題