2012-03-14 6 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 

나는의 getline 함수를 오버로드 나를 필요로하는 추측을,하지만 난에 대해 또는 왜 필요의 이동하는 방법을 아주 확실하지 않다.

어떤 조언이 필요합니까?

+2

http://en.cppreference.com/w/cpp/container/vector

는 "오버로드 기능의 어떤 인스턴스는"잘못된 인수 함수를 호출하고 있음을 의미합니다. 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 개체에 std :: so 접두사를 붙입니다. 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 @ AndréCaron 그것은 나쁘게 말을하지만, 올바르게 std :: strings를 다루는 버전 ... 또한 당신이 그의 문제에 대한 설명을 읽으면, 내 버전이 자신의 도메인에 적합하다는 것을 알게 될 것입니다. 문자. – 111111

+0

감사합니다. – rocklandcitizen

관련 문제