2016-09-11 8 views
-1

입력하고있는 파일이 있습니다. (* blah blah 4324 blah *)와 같은 줄이 있습니다. 23. 내가하려고하는 것은 모든 것을 제거하는 것입니다. 괄호를 닫고 닫힌 괄호 바로 뒤에있는 번호를 유지하십시오.현재 각 줄의 괄호 사이에있는 부분 제거하기

ifstream infile{"nums.txt"}; 
istream_iterator<string> infile_begin_iter {infile}; 
istream_iterator<string> eof; 
vector<string> cleanNums {infile_begin_iter, eof}; 

for(int i=0; i<cleanNums.size(); i++){ 
    int openParen=cleanNums[i].find("(*"); 
    int closeParen=cleanNums[i].find("*)"); 
    int distance=openParen-closeParen; 
    cleanNums[i].erase(closeParen, distance); 
} 

그 코드는 내 프로그램을 중단시키고 아마도 당신을 싫어하게 만듭니다. 나는 여기서 getline과 같은 다른 것들을 찾고 있었지만 거기에서 나는 deliminator 앞에 모든 것을 보여 주었다. 고맙습니다. 주어진 어떤 선언이 없기 때문에

int main() 
{ 
    std::ifstream ifs("test.txt"); 

    std::string skip; // read in parts you want to skip 
    int value;  // the value you want to keep 

    // skip data upto and past ')', then read number 
    while(std::getline(ifs, skip, ')') >> value) 
     std::cout << "found: " << value << '\n'; // output just the number 
} 
+0

어떻게 프로그램이 중단 될 수 있습니까? 오류 메시지가 나타 납니까? 'cleanNums'는 어떻게 정의되어 있습니까? 문제를 해결하는 데 도움이되는 정보가 더 필요합니다. – Frxstrem

+0

디버거를 사용하여 충돌을 해결하십시오. :) 및 게시 최소, 완료 및 확인 가능한 예제 http://stackoverflow.com/help/mcve –

+0

괄호가없는 줄이 있으면 어떻게됩니까? 당신은 무엇을 ['find'] (http://en.cppreference.com/w/cpp/string/basic_string/find)가 돌아올 것이라고 생각합니까? 그 값들로 ['지우기 '] (http://en.cppreference.com/w/cpp/string/basic_string/erase)를 부를 때 어떻게 생각하십니까? –

답변

0

그런 다음 다음 읽기 전화 번호 될 것입니다 알고있다.

질문의 코드 스 니펫에 대한 설명입니다. std::string::find()은 주어진 문자열이 발견 된 위치에 대해 size_type (즉, 보통 정수 유형)을 반환합니다. 그래서 openParencloseParen은 여는 괄호와 여는 괄호가있는 색인이됩니다. std::string::erase()size_type 유형화 된 인수로 호출 할 때이 인수를 지울 색인의 시작 색인 및 길이로 해석합니다. 그러나 제거 할 파트의 시작 인덱스와 마지막 인덱스가있는 곳과 같이 호출합니다. 그래서 당신이해야 할 일은이 두 인덱스를 사용하여 erase()에 전달하기 전에 제거 될 파트의 길이를 계산하는 것입니다.

또 다른 문제가 있습니다. 아마도 프로그램이 중단되는 문제 일 수 있습니다. std::string::find() 호출이 실제로 무엇인가를 발견했는지 확인하지 않습니다. 그럴 수 없다면, 보통은 대부분의 문자열 크기보다 큰 std::string::npos을 반환하기 때문입니다. 결과적으로 인덱스가 범위를 벗어나고 std::string::erase()std::out_of_range 예외를 발생시킵니다. 붐, 프로그램 충돌!

그래서 여기서 교훈은 무엇입니까? Do not 함수/메소드가 예상하는 매개 변수의 종류가 확실하지 않은 경우 을 좋아하는 C++ 참조에서 찾아보십시오. 컴파일러가 사용/컴파일하는 함수의 문서를 읽지 않아도되지만 프로그래머는 적어도 한 번 사용하는 함수의 문서를 읽어야합니다.

2

, 내가 cleanNumsstd::vector<std::string> 있다고 가정 : 당신은 폐쇄 ')' 문자 뒤로 읽어 std::getline를 사용할 수