텍스트 소스를 사용하여 사용자 정의 클래스의 벡터를 초기화 할 수있는 메커니즘을 구현해야합니다. 여기서 소스의 각 행은 클래스의 한 인스턴스를 나타냅니다. 이를 위해 내 수업에는 operator >>
을 구현했으며 stringstream
을 구현했습니다. 소스를 읽을 때마다 한 줄씩 이동하여 원본 소스의 하위 스트림을 얻은 다음 매번 하위 스트림을 구문 분석합니다. 이것은 나에게 3 가지 이점이있다. 첫째, 이렇게하면 텍스트 소스의 한 줄이 내 수업의 한 인스턴스를 정확히 나타낼 수 있습니다. 둘째, 구문 분석 후 나머지 줄이 무시되므로 내 텍스트 소스의 모든 행에 주석을 안전하게 추가 할 수 있습니다. 파서가 반드시 무시해야합니다. 그리고 세 번째로, 구문 분석 오류가 발생하기 때문에 원본 소스에서 벡터의 길이를 말할 필요가 없습니다. (확인하려면 스트림의 fail
및 bad
비트를 확인하십시오.) 벡터 선언 끝났어. 문자열 스트림의 서브 스트림 가져 오기
std::stringstream fullStream;
std::stringstream lineStream;
std::string str;
bool isValid;
myClass newInstance;
std::vector <myClass> result;
// Fill fullStream from external source (codepart omitted)
isValid = true;
while (isValid && ! fullStream.eof ()) {
std::getline (fullStream, str);
lineStream.clear ();
lineStream.str (str);
lineStream >> newInstance;
isValid = ! lineStream.fail ();
if (isValid) {
result.push_back (newInstance);
}
}
있지만 동일한 결과를 얻을 수있는 더 좋은 방법이 있다면, 내가 궁금하네요. 특히, fullStream
에서 lineStream
까지 줄을 추출하는 더 효율적인 방법이 있다면.
감사합니다,
아담
세 개의 다른 스트림이 아닌 서로 다른 스트림을 사용하는 대신 반복기를 사용하여 입력 문자열을 검사하는 것이 훨씬 간단할까요? 귀하의 장소에서 추출 연산자의 논리를 문자열 반복자 쌍을 인수로 사용하여 스트림을 제거하는 일반 함수로 옮깁니다. 나는 당신의 코드가 그렇게 명확하다는 것을 확신합니다. –
이 방법을 사용하면 모든 공백 관리 및 문자열 -> 부동 변환이 자동으로 처리되므로 '연산자'를 사용하고 있습니다. 나는'stringstream'을 사용하지 않고 그것을 어떻게 단순히 달성 할 수 있을지 모른다. –
귀하의 요지를 봅니다. –