私は顔検出アルゴリズムをプログラミングしています。私のコードでは、XMLファイルを解析しています(再帰的に、XMLファイル全体を解析するのに約4分かかります)。Iosteamバイナリを使用してXMLコンテンツをファイルに保存したいと思います。生データを使用するためにC++で構造体を使用しています。
私の目標は、生データファイルが存在しない場合にのみXMLを解析することです。
メソッドは次のように機能します。
- 生データファイルが存在しない場合は、XMLファイルを解析し、データをファイルに保存します。
- 生データファイルが存在する場合は、ファイルから生データを読み取ります
私の問題は、生データファイルを開いてそこから読み取るときはいつでもです。ファイルから少量のバイトしか読み取れません。どれだけかはわかりませんが、ある時点で、バッファで0x00のデータしか受信しません。
私の推測:これは、読み取りおよび書き込み操作用に一定量のバッファーがあるOSバッファーに関係していると思います。私はこれについて間違っているかもしれません。操作のどちらがうまく機能しないかはわかりませんが、書き込みか読み取りのどちらかです。
生データの文字ごとまたは行ごとの書き込み/読み取りを考えていました。一方、ファイルにはテキストが含まれていません。つまり、行ごとまたは文字ごとに読み取ることができません。
生データのサイズは
size_t datasize = DataSize(); == 196876 (Byte)
この関数で取得するのはどれですか
/* Get the upper bound for predefined cascade size */
size_t CCacadeInterpreter::DataSize()
{
// this is an upper boundary for the whole hidden cascade size
size_t datasize = sizeof(HaarClassifierCascade) * TOTAL_CASCADE+
sizeof(HaarStageClassifier)*TOTAL_STAGES +
sizeof(HaarClassifier) * TOTAL_CLASSIFIERS +
sizeof(void*)*(TOTAL_CASCADE+TOTAL_STAGES+TOTAL_CLASSIFIERS);
return datasize;
}
メソッドはこのように機能します
BYTE * CCacadeInterpreter::Interpreter()
{
printf("|Phase - Load cascade from memory | CCacadeInterpreter::Interpreter | \n");
size_t datasize = DataSize();
// Create a memory structure
nextFreeSpace = pStartMemoryLocation = new BYTE [datasize];
memset(nextFreeSpace,0x00,datasize);
// Try to open a predefined cascade file on the current folder (instead of parsing the file again)
fstream stream;
stream.open(cascadeSavePath); // ...try existing file
if (stream.is_open())
{
stream.seekg(0,ios::beg);
stream.read((char*)pStartMemoryLocation , datasize); // **ream from file**
stream.close();
printf("|Load cascade from saved memory location | CCacadeInterpreter::Interpreter | \n");
printf("Completed\n\n");
stream.close();
return pStartMemoryLocation;
}
// Open the cascade file and parse the cascade xml file
std::fstream cascadeFile;
cascadeFile.open(cascadeDestanationPath, std::fstream::in); // open the file with read only attributes
if (!cascadeFile.is_open())
{
printf("Error: couldn't open cascade XML file\n");
delete pStartMemoryLocation;
return NULL;
}
// Read the file XML file , line by line
string buffer, str;
getline(cascadeFile,str);
while(cascadeFile)
{
buffer+=str;
getline(cascadeFile,str);
}
cascadeFile.close();
split(buffer, '<',m_tokens);
// Parsing begins
pHaarClassifierCascade = (HaarClassifierCascade*)nextFreeSpace;
nextFreeSpace += sizeof(HaarClassifierCascade);
pHaarClassifierCascade->count=0;
pHaarClassifierCascade->orig_window_size_height=20;
pHaarClassifierCascade->orig_window_size_width=20;
m_deptInTree=0;
m_numOfStage = 0;
m_numOfTotalClassifiers=0;
while (m_tokens.size())
{
Parsing();
}
// Save the current cascade into a file
SaveBlockToMemory(pStartMemoryLocation,datasize);
printf("\nCompleted\n\n");
return pStartMemoryLocation;
}
bool CCacadeInterpreter::SaveBlockToMemory(BYTE * pStartMemoryLocation,size_t dataSize)
{
fstream stream;
if (stream.is_open() )
stream.close();
stream.open(cascadeSavePath); // ...try existing file
if (!stream.is_open()) // ...else, create new file...
stream.open(cascadeSavePath, ios_base::in | ios_base::out | ios_base::trunc);
stream.seekg(0,ios::beg);
stream.write((char*)pStartMemoryLocation,dataSize);
stream.close();
return true;
}