2013-02-10 3 views
1

seekg & tellg 파일을 사용하는 시나리오에서 나는 두포에서 무슨 일이 일어나고 있는지 궁금해하고 있었습니까?seekg는 파일의 끝을 어떻게 찾습니까?

// Open file and get file size 
    int myFileSize; 
    std::fstream myFile; 
    myFile.open(myFileName, std::ios::in|std::ios::binary); 
    if (myFile.is_open()) 
    { 
     myFile.seekg(0, std::ios::end); 
     myFileSize = myFile.tellg(); 
     myFile.seekg(0, std::ios::beg); 
     myFile.close(); 
    } 

Q1 : 그것은 어떤 특별한 "EOF 문자를"찾을 때까지의 파일의 전체 내용을 걷고 실제로 seekg 있습니까? 또는 파일 시스템이 제공하는 다른 정보를 사용하여 파일의 끝 부분을 "알"수 있습니까?

질문 2 : seekg는 스트림 검색 작업입니다. 파일의 전체 내용이 스트림을 통과해야한다는 의미입니까?

나는 이것이 어떻게 작동하는지에 대한 초보적인 이해 만한다면 용서해주십시오.

+1

"EOF 문자"관련 : https://latedev.wordpress.com/2012/12/04/all-about-eof/ – delnan

답변

6

Q1 : 아니오 OS가 파일의 크기를 알고, seekg()이 그 지식을 사용합니다. 파일의 길이가 1, 100 또는 10000000000 바이트인지 거의 동일한 시간이 걸립니다.

Q2 : 아니오 Windows 또는 Linux 시스템에서 "SetFilePos"또는 "lseek"로 변환되는 현재 "포인터 가져 오기"만 설정합니다. 거의 모든 다른 OS에는 유사한 개념이 있습니다.

+0

고맙습니다. 매우 도움이됩니다. – Lakey

+0

@Mats Petersson 파일 크기를 얻는 가장 좋은 방법은 ifstream이 이미 파일 시스템에서 파일의 크기를 알고 있다면 우리가 파일의 끝으로 가서 크기를 얻은 다음 다시 돌아가는 것과 같은 일을해야한다는 것이 나에게 대단한 것 같다. 처음. 또는 seekg to end 및 tellg 메소드가 신뢰할 수 없다고 주장하는 사람들이 있기 때문에 결국 무시하고 읽은 문자 수를 얻으십시오. 그렇다면 struct stat 메소드가 있다는 것을 보았습니다.하지만 이식성이 얼마나 좋은지 잘 모르겠습니다. 간단한 방법이 있습니까? – Zebrafish

관련 문제