2009-09-10 8 views
5

간단한 텍스트 서식을 사용하여 일부 데이터를 구문 분석하기 위해 스트림 입력 연산자 (연산자 >>)를 오버로드하는 좋은 방법을 찾고 있습니다. 나는 this tutorial을 읽었지만 좀 더 진보 된 것을하고 싶습니다. 내 경우에는 내가 확인하고 싶고 (무시하는) 고정 된 문자열을 가지고있다. 링크에서 2D 포인트 형식을 상정하는 것은 의도 된 효과는 숫자 0.3 0.4를 파싱 더 추천C++ 추출 연산자 오버로드 예제 >> 데이터 구문 분석

Point{0.3 => 
     0.4 } 

이었다. (예, 이것은 매우 어리석은 구문이지만 필요한 여러 아이디어를 통합합니다). 대부분 그냥 등의 공백을 무시하는, 제대로 고정 문자열의 존재를 확인하는 방법을보고 싶어

업데이트 : 아차, 내가 아래에 만든 댓글이 더 형식 (이이 사이트를 사용하여 내 처음이 없습니다). 나는 공백 내가 가진

std::cin >> std::ws; 

같은 문자열을 먹는 뭔가를 생략 할 수 있음을 발견

이제
static bool match_string(std::istream &is, const char *str){ 
    size_t nstr = strlen(str); 
    while(nstr){ 
     if(is.peek() == *str){ 
      is.ignore(1); 
      ++str; 
      --nstr; 
     }else{ 
      is.setstate(is.rdstate() | std::ios_base::failbit); 
      return false; 
     } 
    } 
    return true; 
} 

a의 위치 (줄 번호)를 얻을 수있을하는 것이 좋을 것이다 구문 분석 오류.

업데이트 2 : 있어 라인 번호 및 주석 작업을 구문 분석하는 단지 1 자 모양 미리를 사용. 최종 결과는 여기 AArray.cpp의 parse() 함수에서 확인할 수 있습니다. 이 프로젝트는 직렬화가 가능한 C++ PHP와 같은 배열 클래스입니다.

+0

"추출"또는 "스트림 입력"연산자가 아니라 "비트 시프트"연산자입니다. 스트림 IO 버전 자체는 원래 C 연산자의 오버로드 된 버전이며 실제로는 거의 사용되지 않습니다. –

+1

Chris : 나는 당신과 의견이 다르지 않지만 '>>'연산자와 '<<'연산자를 독립적으로 '스트림 입력/출력'연산자라고 지칭하는 것으로 받아 들여지고 있습니다. Stroustrup의 용어집 정의 << and >을 참조하십시오. http://www.research.att.com/~bs/glossary.html – GRB

+1

@GRB : 연산자 오버로딩은 아닙니다. 비트 오른쪽 시프트 연산자는 C++ stl에 의해 악용되었습니다. 연산자 ^를 고려하십시오. 연산자 오버로딩을 사용하여이를 raise-to-the-power 연산자로 변환 할 수 있습니다. 그러나 단순히 잘못된 우선 순위와 연관성이 있습니다. 새로운 연산자를 추가 할 수없고 기존 연산자의 의미를 변경할 수 없으며 용어에 내포 된 메커니즘 : "오버로딩", 연산자 >>는 비트 오른쪽 시프트 연산자이며 다른 모든 것은 오버로드 된 형식으로 이해됩니다 . –

답변

1

연산자 >> (istream &, 개체 &) 형식화 된 서식없는 서식 기능을 사용하여 입력 스트림에서 데이터를 가져 와서 개체에 넣어야합니다.

유행 후에 더 안전하게하려면, 시작하기 전에 istream :: sentry 객체를 구성하고 테스트하십시오. 구문 오류가 발생하면 setstate(ios_base::failbit)으로 전화하여 my_stream.clear()를 호출 할 때까지 다른 처리를 방지 할 수 있습니다.

예를 들어 <istream> (및 SGI STL을 사용하는 경우 istream.tcc)을 참조하십시오.