2012-04-07 3 views
0

g ++ (버전 4.6.3)에서 다음 코드의 여러 버전을 사용해 보았습니다. 각각의 경우에바이너리 파일을 잘못 읽거나 컴파일러 버그를 읽는 중?

int main(int argc,char *argv[]) 
{ 
    std::string fname(argv[1]); 
    std::cout<<"fname is"<<fname<<std::endl; 

    // std::fstream f(fname.c_str(), 
         std::fstream::in|std::fstream::out|std::fstream::binary); 
    std::fstream f(fname.c_str(),std::ios::in|std::ios::out|std::ios::binary);  
    unsigned char b[512]; 
    memset(b,0xff,512); 
    std::cout<<f.tellg()<<std::endl; 
    f.seekg(0,std::ios::beg); 
    std::cout<<f.tellg()<<std::endl; 
    f.read((char *)b,512); 
    for(int ii=0;ii<sizeof(sector0);ii++) 
     std::cout<<std::hex<<(int)(b[ii]) <<" "; 
    std::cout<<std::endl; 
} 

이 결과는 I 소스 코드 (샘플 ASCII)의 파일 이름을 전달 동일 tellg은 1보고하고 버퍼 파일 일치한다. 실행 파일의 파일 이름 (예제 바이너리)을 전달하면 tellg은 -1을보고 덤프는 모두 ff입니다.

제가 잘못했거나 컴파일러 버그입니까?

+10

힌트 : 컴파일러 버그가 아닙니다. –

+0

가'std :: ios :: out' 모드에서 열리고 있습니까? – keety

+0

keety. 이 부분이 아니라 프로그램의 뒷부분. 물론 샘플을 꺼냈다. –

답변

2

짧은 답변을 드려 죄송합니다. 시간이별로 없습니다.

파일에 단독 잠금이 필요한 쓰기 용 파일 (std::ios::out)을 여는 중입니다. 파일이 이미 사용 중이면 잠금 획득이 실패하므로 열기 및 읽기도 실패합니다.

+0

하지만 그렇다면 이진 파일이 아닌 ascii 파일을 기대하는 이유는 무엇입니까? –

+0

실행중인 이진 = 사용 중입니다. – Sjoerd

+0

단순화 할 때 나는 다른 방식으로 버그를 복제했다. 그게 가장 단순한 형태로 버그를 줄이려고 할 때 일어나는 일입니다. –

관련 문제