2016-07-20 6 views
1

fstream 포인터 fileP_가 있습니다. 그래서 여기 내가 파일의 오프셋 @offset부터 @buffer에서 @size을 읽을
int Read(size_t offset, char *buffer, size_t *size)
: 나는 같은 그것의 정의와 Read() 기능이
fileP_.open(filePath_.c_str(), std::ios::in|std::ios::binary);
:
내가 가진 파일을 엽니 다.
Read()의 내 코드는 다소 다음과 같이이다 :오프셋이 파일 크기를 초과하더라도 eof 비트가 설정되지 않습니다.

int rc = 0 
fileP_.seekg(offset); 
fileP_.read(buffer, *size); 
if (!fileP_.gcount()) { 
    if (fileP_.eof()) 
    *size = rc; 
    else if (fileP_.fail()) 
    rc = -EIO; 
.... 

코드는 offset < filesize 때까지 잘 작동하지만 내가 offset > filesize을 주면 gcount() 내가 -EIO을 얻고, 내가 기대 0을 제공합니다 (예상되는)하지만 offset > filesizesize = rc = 0 경우 .
위 코드에서 아무 것도 누락 되었습니까?
감사합니다.

+0

작업이 실패하면 실패 비트가 설정되고 읽기가 작동하지 않습니다. (eof가 설정되지 않았습니다.) – EFenix

+0

오, 저는 C++을 처음 접했고, 저의 경우 혼란 스럽습니다. 비트가 있습니다. seekg() 후에 failbit이 설정되었는지 확인하도록 코드를 변경했습니다. 고마워요! –

+0

@AntonioGarrido 수표를 놓친 경우 위 코드에서 더 이상 수표가 필요하면 @AntonioGarrido 안내해 주시겠습니까? –

답변

0

당신이 seekg 경우 하나의 작업이 실패 할 경우

는 failbit가 활성화 (EOF 설정되어 있지 않은)와> 파일 크기는 작업이 실패는 failbit가 설정되고 작동하지 않습니다 읽기 ... 다음의 모든 작업을 것이다 상태 비트가 지워질 때까지 아무 작업도하지 마십시오. 이 경우, seekg가 실패하면, istream :: read는 아무것도 읽지 않으며, 특히 eofbit을 설정하지 않을 것이다.

한편 eofbit은 파일의 위치가 "끝에"있을 때 활성화되지 않습니다. 실제로, 스트림이 파일의 끝을 감지 할 때 활성화됩니다. 즉, 다음 char을 가져 오려고 시도하고 EOF가 반환 될 때 활성화됩니다.

일반적으로 C++에서는 eofbit을 사용하여 입력 끝을 제어하는 ​​것이 좋지 않습니다. 작업이 성공적으로 수행되었는지 테스트하는 것이 좋습니다. 작업이 실패하면 eofbit을 사용하여 문제가 파일 끝인지 테스트하십시오.

+0

오케이! 고마워요! :-) –