2012-04-05 89 views
0

在我的程序中編寫人臉檢測算法。
在我的代碼中,我正在解析一個XML文件(以遞歸方式,非常低效需要大約4分鐘來解析整個XML文件)。 我想使用Iosteam二進制文件保存XML內容。 我在C++中使用了一個結構體來使用原始數據。fstream |讀寫操作既不好也不壞|讀寫大文件

我的目標是解析XML 只有如果原始數據文件不存在。如果原始數據文件不存在: 解析XML文件並將數據保存到文件。 2.如果原始數據文件存在 - 讀取文件中的原始數據

我的問題是:每當我打開原始數據文件並從中讀取。 我只能從文件中讀取少量字節,我不知道有多少,但是在某個點上,我的緩衝區中只接收到0x00數據。

我的猜測:我認爲這與OS緩衝區有關,OS緩衝區具有一定數量的讀寫操作緩衝區。我可能是錯的。儘管我不確定操作中的哪一個不能很好地工作,但它可以是寫入或讀取。

我正在考慮寫\通過字符或逐行讀取原始數據字符。另一方面,該文件不包含文本,這意味着我不能逐行讀取或按char字符讀取。

的原始數據大小是

size_t datasize = DataSize(); == 196876 (Byte) 

這是retrive這個功能

/* 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; 
    } 

幫助將是非常讚賞 小號

回答

0

嘗試使用Boost IOstreams庫。 它有一個易於使用的wrrapers文件處理