2009-10-27 3 views
1

세 개의 열이있는 파일에서 데이터를 읽습니다.C++에서 EOF 검사가 실패하는 파일 끝의 공백

3 START RED 
4 END RED 

나는 다음과 같은 검사를 사용하고있는 데이터를 읽으려면 :

while (iFile.peek() != EOF) { 
    // read in column 1 
    // read in column 2 
    // read in column 3 
} 

내 문제는 루프는 보통 여분의 루프를 않는다는 것입니다 같은 예를 들어 데이터가 보일 것입니다. 많은 텍스트 편집기가 실제 내용의 마지막 줄 뒤에 빈 줄을 넣는 것 같아서 이것이 확실합니다.

저는 인터넷 검색을 약간했기 때문에 SO를 찾아서 Reading from text file until EOF repeats last line과 같은 유사한 상황을 발견했습니다. 그러나 문제를 해결하기 위해 주어진 해결책을 채택하는 것 같지 않았습니다. 어떤 제안?

답변

2

istream입니다 :

이 무한 루프 때이기 때문에 당신은 에 루프 (BTW iFile.eof()으로 검사 할 수 있습니다) EOF에뿐만 아니라 어떤 오류, 탈옥해야

모든 형식 실패는 스트림을 EOF와 다른 나쁜 상태로 설정합니다. 일반적으로 루프의 중간에있는 읽기 루프를 빠져 나가야합니다. 모든 것이 읽히거나 (성공적으로 또는 성공적으로), 입력되기 전에 필요합니다.

더 이상 오는 재미 있지있는 일이 있는지 확인하려면, 당신은, 루프 후, 스트림 상태를 재설정하고 만 도달 EOF 때까지 공백 읽으려고 수 :

while(!iFile.eof()) 
{ 
    iFile >> std::ws; 
    string line; 
    std::getline(iFile,line); 
    if(!line.empty()) error(...); 
} 
+0

+1 바보 같은 익명의 drive-by downvoter를 카운터 할 수 있습니다. –

0

읽기가 실패한 경우 (열 데이터를 읽는 경우) while 루프에서 벗어납니다. 아마도 당신은 파일의 끝에 다음이며, 어쩌면 당신이 다음 공백 및 기타 유효하지 않은 입력을 처리하는 것이 좋습니다 생각합니다 마지막으로 '올바르지 않은'라인

+0

읽기 실패 여부를 확인하려면 어떻게해야합니까? 읽은 값이 받아 들일만한 값인지를 검사하는 것만으로? 그렇다면 새로운 데이터를 읽지 못하면 변수에 이전 데이터가 남기 때문에 작동하지 않습니다. 이것을 확인하는 다른 방법이 있습니까? – blcArmadillo

+0

EOF가 설정됩니다. 그러나 다른 사람들이 말했듯이 : 줄 단위로 이동하는 것이 더 쉬울 수도 있고, 3 개의 연속적인 읽기를 수행하는 대신 줄 바깥의 값을 구문 분석하여 – Toad

0

을 읽고. 아마도 컬럼 1,2,3의 기본적인 검증 또한 바람직 할 것이다.

0

반복 횟수에 대해 걱정할 필요가 없습니다. 데이터의 유효성을 검사하고 잘못된 입력을 처리하십시오.

기본적으로, 당신이 읽을 수있는 세 개의 열이 있고 파일이 이상 나 때문에 다른 문제입니다 있기 때문에 만약 당신이 결정하지 않는 경우에 있는지 확인하십시오. iFile를 가정하면

4

EOF가 아니다 예측이지만 오류 상태입니다. 당신이 지금 사용하고있는 것처럼 따라서, 당신은 당신이 그런 이유로 열 1, 2, 3을 읽을 수 있는지 여부를 예측하는 데 사용할 수 없습니다, C++의 일반적인 패턴은 다음과 같습니다

while (input >> obj1 >> obj2) { 
    use(obj1, obj2); 
} 

모든 operator>>(istream& is, T&) 반환 부울 컨텍스트에서 사용되는 경우 스트림은 마지막 추출이 성공한 한 "true"입니다. 그런 다음 추출 된 객체를 사용하는 것이 안전합니다.