2015-01-24 3 views
0

내가 텍스트 파일이 내부 문자열 구문 분석 : I 유형 학생의 벡터로 읽고 싶은벡터 C++

bob,10,20,30 
joe,50,60,50 
shelly,20,15,29 

가 정의 :)

class student 
    { 

     public: 
     string name; 
     int exam1; 
     int exam2; 
     int exam3; 

      student (string s, int x, int y, int z) 
      { 
       name = s; 
       exam1 = x; 
       exam2 = y; 
       exam3 = z; 
      } 
    }; 

사용 반복자 (시작 및 end()를 사용하면 줄 단위로 문자열을 저장할 수 있지만 이러한 문자열을 구문 분석하여 학생 이름과 시험 점수를 저장할 수 있기를 원하지만이 작업을 수행 할 수 있는지 여부는 알 수 없습니다.

문자열 클래스에서 'find'및 'substr'에 대한 내용을 읽었지만 일반적으로 이터레이터 및 벡터에 조금 익숙합니다. 타입이 'find'와 'substr'을 사용하여 어떻게 벡터를 파싱 할 수 있습니까? 이미 코드 또는 생각에 많은 오류가있을 수 있습니다.

표준 C++ 라이브러리는 당신을위한 문자열을 파싱하기 위해
int main() 
{ 
    //Open file and create iterator 
    ifstream file ("test.txt"); 
    istream_iterator<string> begin (file), end; 

    vector<student> vec (begin, end); 
} 
+1

가능한 중복 (http://stackoverflow.com/questions/2880903/simple-string-parsing-with-c) – Nikko

답변

4

에서, student 클래스의 사용자 정의 입력 연산자 >>을 제공 : 주

istream &operator >>(istream &input, student &res) { 
    string s; 
    int x, y, z; 
    char comma; // Ignored 
    getline(input, s, ','); 
    input >> comma >> x >> comma >> y >> comma >> z; 
    res = student(s, x, y, z); 
    return input; 
} 

이 구현은 덜 효율적이다 그것이 필요할 수 있기 때문에 가능합니다. 왜냐하면 복사가 필요하기 때문입니다. 당신은 그들이 공공 때문에, student의 필드에 직접 작성하여 더 효율적으로 만들 수 있습니다 :

istream &operator >>(istream &input, student &res) { 
    getline(input, res.name, ','); 
    char comma; // Ignored 
    input >> comma >> res.exam1 >> comma >> res.exam2 >> comma >> res.exam3; 
    return input; 
} 

마지막으로, 필드는 비공개로 수 있고, student 클래스의 operator >>friend을 선언합니다.

+0

@BillLynch 좋은 지적, 감사합니다! – dasblinkenlight

+0

두 번째 예제를 시도하면 'std :: istream & student :: operator >> (std :: istream &, student &)'오류가 발생합니다. 하나의 인수 만 사용해야합니다. – SSOPLIF

+0

@filposs 클래스의 '친구'가되지 않는 클래스. '친구'로 표시하면 비회원이되고 두 번째 매개 변수를 사용할 수 있습니다. 자세한 내용은 [이 Q & A] (http://stackoverflow.com/q/3312269/335858)를 참조하십시오. – dasblinkenlight

-1

cucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjgh [C와 구문 분석을 단순 문자열 ++]의 jgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjggcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjgcucfgjvgjghjg