0

私は顔検出アルゴリズムをプログラミングしています。私のコードでは、XMLファイルを解析しています(再帰的に、XMLファイル全体を解析するのに約4分かかります)。Iosteamバイナリを使用してXMLコンテンツをファイルに保存したいと思います。生データを使用するためにC++で構造体を使用しています。

私の目標は、生データファイルが存在しない場合にのみXMLを解析することです。

メソッドは次のように機能します。

  1. 生データファイルが存在しない場合は、XMLファイルを解析し、データをファイルに保存します。
  2. 生データファイルが存在する場合は、ファイルから生データを読み取ります

私の問題は、生データファイルを開いてそこから読み取るときはいつでもです。ファイルから少量のバイトしか読み取れません。どれだけかはわかりませんが、ある時点で、バッファで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;
    }
4

1 に答える 1

0

BoostIOstreamsライブラリを使用してみてください。それはファイル処理のための使いやすいラッパーを持っています

于 2012-04-06T14:03:01.473 に答える