2011-08-17 10 views
0

그래서 저는 C++로 조금 놀았으며 바이너리 모드로 파일을 열고 쓰는 것을 포함하는 프로그램을 작성하기로 결정했습니다. 나는 C++의 iostream 기능에 익숙하지 않다. (대부분 API 기반 프로그래밍을한다.) 그러나 주제에 대한 몇 가지 기술 지침을 읽고 몇 가지 코드를 썼다. 이 코드는 하나의 파일을 열어 버퍼에 데이터를 읽은 다음 해당 버퍼를 다른 형식으로 변환하고 다른 파일에 쓰는 것을 의미합니다. 문제는 분명히 null 포인터의 유효하지 않은 사용을 중심으로 "Debug Assertion"오류가 계속 발생한다는 것입니다. 그러나 코드를 살펴볼 때 이해할 수 없었습니다. 아마도 iostream 라이브러리를 오용하거나 간단한 논리 오류를 만들었을 것입니다. 나는 다양한 기능에 대해 서로 다른 출력을 포맷하기 위해 동일한베이스를 사용할 계획이므로 별도의 SetMemBlock 기능이 필요하다. 이것은 단지 나의 원형 일뿐입니다. 당신은 값으로 SetMemBlockMemBlock을 전달하는C++ 디버그 어설 션 오류

const DebugMode = true; 

class A 
{ 
public: 
    bool FileFunction(const char *, const char *); 

protected: 
    bool SetMemBlock(char *, std::fstream &, std::streamoff &); 

private: 
    std::fstream SrcFileStream; 
    std::fstream DestFileStream; 
}; 

bool A::SetMemBlock(char* MemBlock, std::fstream & FileStream, std::streamoff & Size) 
{ 
    std::streamoff TempOff = 0; 
    //This is meant to check for a non-empty buffer and to see if the stream is valid. 
    if(MemBlock != 0 || !FileStream.is_open()) 
     return false; 

    TempOff = FileStream.tellg(); 
    FileStream.seekg(0, std::ios::end); 
    Size = FileStream.tellg(); 

    MemBlock = new(std::nothrow) char[ (int) Size ]; 

    if(MemBlock == 0) 
     return false; 

    FileStream.seekg(0, std::ios::beg); 
    FileStream.read(MemBlock, (int) Size); 

    if(!FileStream) 
     return false; 

    FileStream.seekg(TempOff); 
    return true; 
} 

bool A::FileFunction(const char * SrcFile, const char * DestFile) 
{ 
    char * MemBlock = 0; 
    std::streamoff Size = 0; 

    SrcFileStream.open(SrcFile, std::ios::binary | std::ios::in); 
    DestFileStream.open(DestFile, std::ios::binary | std::ios::out); 

    if(!SrcFileStream.is_open() || !DestFileStream.is_open()) 
     return false; 

    if(DebugMode) 
    { 
     std::cout<<"Files opened succesfully...\nNow writing memory block..."<<std::endl; 
    } 

    if(!SetMemBlock(MemBlock, SrcFileStream, Size)) 
    { 
     std::cout<<"An error occured when reading to memory block!"<<std::endl; 
     return false; 
    } 

    if(DebugMode) 
    { 
     std::cout<<"Memory block written..."<<std::endl; 
    } 

    DestFileStream.seekp(std::ios::beg); 
    DestFileStream.write(MemBlock, Size); 

    SrcFileStream.close(); 
    DestFileStream.close(); 
    delete[] MemBlock; 
    return true; 

} 

답변

1

: 어쨌든, 여기 내 빠른 n '은 더러운 수준의 설정입니다. 따라서이 함수는 호출 함수에 영향을주지 않는 로컬 복사본의 값을 설정하기 만합니다. 따라서 호출 함수에서 MemBlock의 값은 가비지로 남습니다. 그것을 포인터로 사용하면 아마 어설 션 (운이 좋다면) 또는 아웃 - 아웃 충돌 (그렇지 않은 경우)이 될 것입니다. 대신 인수로 참조를 전달하려고합니다.

이 용어의 의미를 모르는 경우 Google은 '가치에 의해 전달'과 '참조로 전달'을 의미합니다. 차이점을 이해해야합니다. 참조로

+0

OH ROFL! 나는 그 차이를 안다. 나는 단지 지체되었다. 도와 주셔서 감사합니다. –

0

패스 MemBlock :

bool A::SetMemBlock(char*& MemBlock, std::fstream & FileStream, std::streamoff & Size)