2017-11-14 8 views
0

입력 파일이 문자로 시작되면 int1을 다시 쓸 수 없기 때문에 while 루프를 멈추게됩니다.하지만 이걸 감지 할 수 있으면 어떻게하면 workinfile>>int1이 작동하지 않고 루프를 계속한다는 오류 메시지가 나타납니다 ? ifstream while 루프를 사용하면 입력 오류를 표시하고 다음 줄에서 재개하는 방법은 무엇입니까?

cin>>filename; 
ifstream workingfile(filename); 

while (workingfile>>int1>>int2>>string1>>string2) { 
    cout<<int1<<int2<<string1<<string2<<endl; 
    linenumread++; 
} 

내가 노력을하고 있지만 작동하지 않는, 어떤 도움은 그것뿐만 아니라 문자열을 읽기를 정지하는 경우 검출 할 수있을 것이다 또한
while (workingfile>>int1>>int2>>string1>>string2) { 
    if(!(workingfile>>int1)) 
    { 
     cout<<"Error first value is not an integer"<<endl; 
     continue; 
    } 
    cout<<int1<<int2<<string1<<string2<<endl; 
    linenumread++; 
} 

을 감상 할 수있다?

입력 파일은 내가 잘못된 입력을 칠 때, 검출 오류 메시지를 표시하고, 파일의 다음 라인을 계속하려면이

10 10 ab bc 
11 11 cd ef 
a 
12 12 gh hi 

과 같을 것이다.

+0

while 루프가 유효하지 않은 입력에서 중단됩니다 : 다음과 같이 보일 것이다

. 최선의 방법은 루프 상태에서'std :: getline()'을 사용하여 완전한 라인을 읽고'std :: istringstream'을 사용하여 문자열을 파싱하고 각 값을 검사하는 것입니다. – user0042

+0

스택 오버플로에 오신 것을 환영합니다! 코드가 불완전합니다. 특히'main()'함수와 적어도 하나의'#include '함수가 빠져있는 것 같습니다. 코드를 [편집]하여 문제의 [mcve]가되도록 만드십시오. 그런 다음 재현하고 해결할 수 있습니다. 또한 [ask]를 읽어야합니다. –

+1

@TobySpeight 여기서 전체 코드를 제공 할 필요는 없습니다. 이 문제는 주어진 예제에서 꽤 분명합니다. 나는 오늘 더 심한 질문을 보았다. – user0042

답변

5

이런 종류의 입력의 경우 일반적으로 전체 라인을 읽고 해당 라인에서 값을 추출하는 것이 좋습니다. 행을 구문 분석 할 수없는 경우 해당 행에 대해 실패를보고하고 다음 행의 시작부터 계속할 수 있습니다.

std::string line; 
while (std::getline(workingfile, line)) // Read a whole line per cycle 
{ 
    std::istringstream workingline(line); // Create a stream from the line 
    // Parse all variables separately from the line's stream 
    if(!(workingline>>int1)) 
    { 
     cout<<"Error first value is not an integer"<<endl; 
     continue; 
    } 
    if(!(workingline>>int2) 
    { 
     cout<<"Error second value is not an integer"<<endl; 
     continue; 
    } 
    // ^^^^ a.s.o. ... 
    cout<<int1<<int2<<string1<<string2<<endl; 
    linenumread++; 
} 
+0

실제로 getline 메서드를 사용하여 실제로 시도했지만 별도의 변수로 나눌 수 없습니다. istringstream에 대해 몰랐습니다. 감사합니다. – Lewis

+0

@Lewis 여기를 참고하십시오 : http : //en.cppreference. co.kr/w/cpp/io/basic_istream – user0042

+0

이 프로젝트가 엄청난 도움이되었다는 것을 알려 드리고 싶었습니다. 프로젝트를 진행하고 있습니다. 정말 감사드립니다. – Lewis