2015-01-29 3 views
-1
std::vector<std::bitset<8>>& vecBin 

vecBin 정확히 4 요소가있는 경우, 다음과 같은 상황이 발생합니다, 호출 (버프, MBLOCK_SIZE를) sgetn하는sgetn는 const를 매개 변수를 "덮어 쓰기"

bool BinFinder::containsInFile(const std::vector<std::bitset<8>>& vecBin, uint fails/* = 1*/) 
{ 
    if (fails >= vecBin.size()) return true; 

    file.open(path, std::ifstream::binary); 
    if ((file.rdstate() & std::ifstream::failbit) != 0) 
     exit(EXIT_FAILURE); 

    // Reading blocks of 4 KiB (MBLOCK_SIZE = 4096 Bytes) 
    //file.read(buff, MBLOCK_SIZE); 
    bool found {}; 
    uint bytesRead { 1 }, foundAtJ {}, failed {}; 
    while(/*file.good()*/!file.eof() && !found && bytesRead > 0) 
    { 
     failed = 0; 

     // Reading blocks until 4 KiB (MBLOCK_SIZE = 4096 Bytes) 
     //bytesRead = file.rdbuf()->sgetn(buff, MBLOCK_SIZE); 
     std::streambuf *sb = file.rdbuf(); //debug 

     std::cout << "After rdbuf" << std::endl; //debug 
     for (auto i = 0; i < vecBin.size(); ++i) //debug 
      std::cout << vecBin.at(i) << std::endl; //debug 

     bytesRead = sb->sgetn(buff, MBLOCK_SIZE); //debug 

     std::cout << "After sgetn" << std::endl; //debug 
     for (auto i = 0; i < vecBin.size(); ++i) //debug 
      std::cout << vecBin.at(i) << std::endl; //debug 


... 

후이 호출이를 덮어 같다 이 코드 조각의 출력 마부 vecBin의 내용은 다음과 같습니다

output After rdbuf 01100010 01100011 01110101 10101010 After sgetn 00110011 00001010 01101111 10101010

왜 sgetn는 vecBin의 내용을 수정하는 것입니다!

답변

0

sgetn은 연결된 스트림 버퍼에서 문자를 가져 와서 전달한 배열에 저장합니다. 코드에 buff의 정의가 포함되어 있지 않으므로 vecBin의 내용을 별칭으로 가정하면 vecBin이 변경된 이유를 설명합니다.

관련 문제