0

我正在编写人脸检测算法。在我的代码中,我正在解析一个 XML 文件(以递归方式,非常低效,我需要大约 4 分钟来解析整个 XML 文件)。我想使用Iosteam二进制文件将 XML 内容保存到文件中。我在 C++ 中使用结构来使用原始数据。

我的目标是仅在原始数据文件不存在时才解析 XML 。

该方法的工作原理如下:

  1. 如果原始数据文件不存在,则解析 XML 文件并将数据保存到文件中。
  2. 如果原始数据文件存在,则从文件中读取原始数据

我的问题是:每当我打开原始数据文件并从中读取时。我只能从文件中读取少量字节,我不知道有多少,但在某个点上,我的缓冲区上只收到 0x00 数据。

我的猜测:我相信这与操作系统缓冲区有关,它有一定数量的缓冲区用于读写操作。这一点我可能是错的。虽然我不确定操作中的哪一个效果不好,但要么是写入,要么是读取。

我正在考虑逐个字符或逐行写入/读取原始数据。另一方面,该文件不包含文本,这意味着我无法逐行读取或逐字符读取。

原始数据大小为

   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

尝试使用Boost IOstreams 库。它有一个易于使用的包装器来处理文件

于 2012-04-06T14:03:01.473 回答