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