간단한 텍스트 서식을 사용하여 일부 데이터를 구문 분석하기 위해 스트림 입력 연산자 (연산자 >>)를 오버로드하는 좋은 방법을 찾고 있습니다. 나는 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와 같은 배열 클래스입니다.
"추출"또는 "스트림 입력"연산자가 아니라 "비트 시프트"연산자입니다. 스트림 IO 버전 자체는 원래 C 연산자의 오버로드 된 버전이며 실제로는 거의 사용되지 않습니다. –
Chris : 나는 당신과 의견이 다르지 않지만 '>>'연산자와 '<<'연산자를 독립적으로 '스트림 입력/출력'연산자라고 지칭하는 것으로 받아 들여지고 있습니다. Stroustrup의 용어집 정의 << and >을 참조하십시오. http://www.research.att.com/~bs/glossary.html – GRB
@GRB : 연산자 오버로딩은 아닙니다. 비트 오른쪽 시프트 연산자는 C++ stl에 의해 악용되었습니다. 연산자 ^를 고려하십시오. 연산자 오버로딩을 사용하여이를 raise-to-the-power 연산자로 변환 할 수 있습니다. 그러나 단순히 잘못된 우선 순위와 연관성이 있습니다. 새로운 연산자를 추가 할 수없고 기존 연산자의 의미를 변경할 수 없으며 용어에 내포 된 메커니즘 : "오버로딩", 연산자 >>는 비트 오른쪽 시프트 연산자이며 다른 모든 것은 오버로드 된 형식으로 이해됩니다 . –