2012-03-14 8 views
3

辞書の単語を含むテキストファイルの行を配列オブジェクトにロードしようとしています。 "a"で始まる単語、 "b"で始まる単語、アルファベットのすべての文字を保持する配列が必要です。クラス内のfstream getline()関数の使用

ここに、私が配列オブジェクト用に書いたクラスがあります。

#include <iostream> 
    #include <string> 
    #include <fstream> 

    using namespace std; 

    class ArrayObj 
    { 
    private: 

     string *list; 
     int size; 

    public: 


     ~ArrayObj(){ delete list;} 

     void loadArray(string fileName, string letter) 
     { 
      ifstream myFile; 
      string str = ""; 
      myFile.open(fileName); 

      size = 0; 

      while(!myFile.eof()) 
      { 
       myFile.getline(str, 100); 

       if (str.at(0) == letter.at(0)) 
        size++; 
      } 
      size -= 1; 

      list = new string[size]; 

      int i = 0; 
      while(!myFile.eof()) 
      { 
       myFile.getline(str, 100); 

       if(str.at(0) == letter.at(0)) 
       { 
        list[i] = str; 
        i++; 
       } 
      } 

      myFile.close(); 
     } 


    }; 

私はというエラーを取得しています:

2 IntelliSense: no instance of overloaded function  "std::basic_ifstream<_Elem, _Traits>::getline [with _Elem=char, _Traits=std::char_traits<char>]" matches the argument list d:\champlain\spring 2012\algorithms and data structures\weeks 8-10\map2\arrayobj.h 39 

を私はgetl​​ine関数をオーバーロードするために私を必要だと思うが、それは必要だ、なぜ私は約行く方法はかなり確実ではないですか。

アドバイスはありますか?

+2

「オーバーロードされた関数のインスタンスは、」あなたは間違った引数を持つ関数を呼び出していることを意味しません。 getlineに適切なものを渡していることを確認してください。たとえば、[getline](http://linux.die.net/man/3/getline)には文字列ではなくchar **が必要ですこれはchar *です)。 –

+1

@MarshallConover: ''の 'getline()'関数を参照していますが、 ''と ''の関数ではありません。 –

答えて

5

std :: stringを扱うストリームの関数は、istreamのメンバ関数ではなく、むしろ自由に使用できる関数です。 (メンバ関数バージョンはchar *を扱います)。

std::string str; 
std::ifstream file("file.dat"); 
std::getline(file, str); 

それはあなたがそうのようにやろうとしているものを行うには良い、より安全な方法がある注目に値する:

#include <fstream> 
#include <string> 
#include <vector> 

//typedeffing is optional, I would give it a better name 
//like vector_str or something more descriptive than ArrayObj 
typedef std::vector<std::string> > ArrayObj 

ArrayObj load_array(const std::string file_name, char letter) 
{ 
    std::ifstream file(file_name); 
    ArrayObj lines; 
    std::string str; 

    while(std::getline(file, str)){ 
     if(str.at(0)==letter){ 
      lines.push_back(str); 
     } 
    } 
    return lines; 
} 


int main(){ 
    //loads lines from a file 
    ArrayObj awords=load_array("file.dat", 'a'); 
    ArrayObj bwords=load_array("file.dat", 'b'); 
    //ao.at(0); //access elements 
} 

車輪の再発明をしないでください。彼らは標準であり、あなたに多くの時間と苦痛を節約します。

最終的に私が行っていない理由の全体のホストのために悪いusing namespace stdを入れないようにしてください; std :: coutやstd :: stringのようにstdオブジェクトに接頭辞を付けます。

http://en.cppreference.com/w/cpp/container/vector http://en.cppreference.com/w/cpp/string/basic_string/getline http://en.cppreference.com/w/cpp/string

+0

最初の文章では、 'getline()'が 'istream'のメンバーではないと思ったと思います。しかし、 'istream :: getline()'関数があります。また、動作は同じではないことに注意してください。メンバーバージョンは行末を見つけられなくても 'n'文字だけを読み込み、メンバ以外のバージョンは行全体を読み込むのに必要なバッファを増やします。しかし、ほとんどのアプリケーションでは、あなたの投稿で使用されているようなグローバルバージョンが望ましい動作です。 –

+0

@AndréCaronひどく言われていますが、正しくは、std :: stringsを扱うバージョン...また、問題の説明を読んだ場合、私のバージョンは、文字。 – 111111

+0

よろしくお願いいたします。 – rocklandcitizen

関連する問題