2014-09-09 3 views
-1

에 숫자 만 들어 있어야하는 파일을 읽으려고합니다. 해당 조건을 충족하는 경우 전체 파일을 성공적으로 읽을 수 있지만 그 안에 편지가있는 경우 오류 문과 함께 false를 반환해야합니다.C++ 숫자 만있는 파일에서 읽음 (double)

문제는 내 프로그램이이 문자를 찾으면 오류가 발생한다는 것입니다. 아무런 문제가 없다는 것을 발견 할 수는 있지만 건너 뛸 때 결정됩니다.

파일에 읽고 숫자 만에 읽으려고하는 내 코드 :

bool compute::Read (ifstream& stream) 
{ 
    double value; 
    string line; 
    int lineNumber = 1; 

    if (stream) 
    { 
     while (getline(stream, line)) 
     { 
      lineNumber++; 
      istringstream strStream(line); 

      while (strStream >> value) 
      { 
       cout << value << endl; 
      } 

     } 

    } 

    return true; 
} 

나는이에 사용하는 입력 파일이 아닌 숫자가 있음을

70.5 61.2 A8 10.2 
2 

공지 사항입니다 내 입력 파일의 문자. 그 시점에서 실패하고 false를 반환해야합니다.

현재는 "A"에 도달하면 단순히 다음 줄로 돌아가서 getline while 루프를 계속합니다.

감사의 말을 전하면됩니다.

+0

하자. 파일에'doubles '가 포함되어 있지 않거나 바이너리로 읽어야 할 경우. 여기에는 * 실제 숫자 *가 텍스트 형식으로 포함되어 있으므로 * double *로 변환해야합니다. – EJP

+0

코드에 멈추고 false를 반환하는 지침이 없습니다 ... –

+0

@EJP 두 배가 포함되어있어 표현됩니다 텍스트로. – CashCow

답변

1

문자열 스트림 이 오류를 잡아 내지 만 오류가 발견되면 계속해서 둘러싼 루프가 중단되지 않도록합니다. 메인 루프를 조정하여 스트링 스트림이 오류를 발견 할 때 중지되도록해야합니다. 스트링 스트림이 각 반복에서 재구성되는 경우에는 수행 할 수 없습니다. 대신 for() 루프를 만들고 선언 부분에 stringstream을 생성해야합니다. 그리고 루프에 대한 조건은 "문자열 스트림과 stream이 오류를 포착하지 않는 한"이어야합니다. 예를 들어 : 방금 각 값을 인쇄하려면 std::getline() 또는 std::istringstream을 사용할 필요가 같은

for (std::istringstream iss; iss && std::getline(stream, line);) 
{ 
    iss.clear(); 
    iss.str(line); 

    while (iss >> value) 
    { 
     std::cout << value << '\n'; 
    } 
} 

Futhermore, 그것은 보이지 않는다. 그냥 수행 그것은 double에 대한 잘못된 문자를 발견하면

while (stream >> value) { 
    std::cout << value << '\n'; 
} 

은 위의 중지됩니다.

+0

답변 해 주셔서 감사합니다. 그것은 비록 귀하의 의견의 전반부에 while 루프가 입력하지 않는 것처럼 보인다. 저는 그것을 사용하여 숫자만으로 된 파일을 제공하려고 시도했습니다. 그리고 그것을 입력하지 않았습니다. 왜 그럴지 모른다고 생각 해요? 나는 점검했고 for 루프를 입력했다. – Sej

+0

@Sej 여전히 작동하지 않는다면'iss.clear()'를'iss.str()'줄 위로 이동하십시오. – 0x499602D2

0

스트리밍을 중지하려면 코드가 필요하지만 "입력"의 끝에 도달하지 않은 경우 false를 반환해야합니다.

한 가지 방법은 한 번에 한 단어 씩 구문 분석하는 것이지만, 가장 효율적이지만 여전히 한 가지 방법은 아닙니다. 당신이 std::string에 처음 읽고 작동하는지 (그래서 문자열이 비어 있지 않은) 경우

는 해당 문자열에서 istringstream을 만들거나 기존의 것을 재사용 및 double 값으로 그 스트리밍하려고합니다.

이것이 실패하면 잘못된 문자가 나타납니다.

물론 파일에서 한 번에 한 줄씩 읽은 다음 단어로 나눌 수 있으므로 잘못된 텍스트가 발견 된 줄을 나타내는 의미있는 오류 메시지를 출력 할 수 있습니다.

똑바로 복식으로 읽는 문제는 스트림이 파일 끝에 도달하면 스트림이 실패한다는 것입니다.

그러나 실패 이유는 확인할 수있는 오류 상태 (예 : eofbit)가 설정되어 있는지 확인할 수 있기 때문에 해결할 수도 있습니다. eofbit의 f는 "파일"을 나타내지 만 파일이 아닌 모든 스트림에 적용됩니다.

이 방법은 단어를 먼저 문자열로 읽는 것보다 소리가 좋을 지 모르지만, 읽은 내용을 오류로 인쇄하려면 오류를보고 할 수 있기를 원하므로 보통 방법으로 선호합니다.

관련 문제