문제

나는 최근에 fstream :: eof ()를 사용하여 발생하는 문제에 부딪쳤다. 다음 줄을 읽었습니다 여기:

관련 입력 파일의 끝에 도달 한 경우 함수 eof ()는 true를 반환합니다. 그렇지 않으면 false.

그리고 (실수로) 이것이 fstream :: read ()를 사용하고 파일의 끝을 지나서 읽으면 함수 eof ()가 말해 줄 것임을 의미했습니다. 그래서 나는 이런 일을했습니다 (매우 일반화) :

for(int i = 0; i < max && !file.eof(); i++)
{
     file.read(mything, sizeof(mything));
}

문제는 위의 링크 된 페이지에서 나중에 설명 된 내용 때문에 발생했습니다 (오해의 소지가있는 첫 번째 단락 덕분에 처음 읽지 못했습니다).

반대로, 마지막 토큰 이후의 공백이 발생하면 스트림이 EOF 상태로 가지 않지만 다른 토큰을 읽으려고 시도하면 여전히 실패합니다. 따라서 EOF 플래그는 EOF까지 모든 스트림 내용을 읽기위한 루프에서 테스트로 사용할 수 없습니다. 대신 읽기 시도 후에 실패 조건을 확인해야합니다.

그래서 나는 변경했고 이제 루프가 file.eof ()가 아닌 file.fail ()에 대해 확인하고 eof ()가 작동하는 방식을 이해합니다. 내 질문은 왜 그런 식으로 작동합니까? 이것이 바람직한 상황이 있습니까? EOF를 통과 한 후에는 EOF를 통과하고 EOF ()가 TRUE를 반환 해야하는 것 같습니다.

업데이트답변 해 주셔서 감사합니다. 내가 수행하는 유일한 작업은 Read ()이며 즉시 FAIL ()을 확인하므로 괜찮다고 생각합니다. 이제 내 질문은 무엇입니다 ~일 것이다 나는 eof ()를 사용합니까?

도움이 되었습니까?

해결책

이런 식으로 감지 할 수 있기 때문입니다 EOF 파일이 얼마나 큰지 알지 못하고. 그것이해야 할 일은 단순히 읽으려고 시도하는 것입니다. 읽기가 짧지 만 오류가 아닌 경우 파일의 끝에 도달했습니다.

이것은 다음의 기능을 반영합니다 read 파일 IO가 일반적으로 호출을 끝내는 시스템 호출 (Win32 물건이 호출 할 수 있습니다. ReadFile 그러나 나는 기능이 비슷하다고 생각한다).

로부터 read "반환 값"섹션 (강조 추가) 맨 페이지 :

성공시 바이트 읽기 수가 반환됩니다. (제로는 파일 끝을 나타냅니다), 파일 위치는이 번호로 고급됩니다. 이 숫자가 요청 된 바이트 수보다 작은 경우 오류가 아닙니다. 예를 들어, 실제로 바이트가 실제로 사용 가능하기 때문에 (아마도 파이프 끝과 가까이 있었거나 파이프에서 읽거나 터미널에서 읽고 있기 때문에) 또는 read ()가 신호. 오류가 발생하면 -1이 반환되고 Errno가 적절하게 설정됩니다. 이 경우 파일 위치 (있는 경우)가 변경되는지 여부는 지정되지 않습니다.

BTW : 원하는 것을 쓰는 좋은 방법은 다음과 같습니다.

T something;
while(file.read(something, sizeof(something))) {
    // process your 'something'
}

이것은 작동하기 때문에 작동합니다 file.read (iostream의 많은 구성원과 마찬가지로) ioStream 자체에 대한 참조를 반환합니다. 스트림 상태를 테스트 할 수 있도록 작업자가 과부하가 걸렸습니다. 비슷하게 읽는 것과 유사합니다 std::cin, while(std::cin >> x) { ... } 작동합니다.

편집하다: 테스트 대 실패도 같은 이유로 똑같이 잘못 될 수 있음을 알아야합니다. 당신이 링크 한 페이지에서 fail() IF를 반환합니다 이전 작업이 실패했습니다. 즉, 테스트하기 전에 읽기 또는 기타 관련 작업을 수행해야합니다.

다른 팁

int n;
std::cin >> n >> std::stripws;

이 문제를 해결합니다. 이 시점에서 .good () 또는 .eof ()를 사용할 수 있습니다. 디스크 블록이 잘못되면 .good ()가 감지하므로 .good ()를 사용하고 싶습니다. 하지만 그게 나야. .eof ()는 그렇지 않으면 .fail () ||를 추가해야합니다. .나쁜().

나는 공백을 먹는 문제에 대한 어려운 연구 후에 이것을 발견했다. 나는 iostream과 ifstream에 에코를 제안하려고했고, 이미 완료되었습니다. :-디

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top