2012-04-05 5 views
0

In meiner Programmierung ein Gesichtserkennungsalgorithmus.
In meinem Code analysiere ich eine XML-Datei (in einer Rekursionsweise, sehr ineffizient dauert meine etwa 4 Minuten, um die gesamte XML-Datei zu analysieren). Ich möchte den XML-Inhalt unter Verwendung Iosteam binär in eine Datei speichern. Ich verwende eine Struktur in C++, um die Rohdaten zu verwenden.fstream | Schreiboperation funktioniert weder gut noch schlecht | Lesen Sie in große Dateien schreiben

Mein Ziel ist es, das XML nur zu analysieren, wenn die Rohdatendatei nicht existiert.

Die Methode funktioniert wie folgt: 1. Wenn die Rohdatendatei nicht vorhanden ist: Analysieren Sie die XML-Datei und speichern Sie die Daten in einer Datei. 2. Wenn die Rohdatendatei vorhanden ist - Lesen Sie die Rohdaten aus der Datei

Mein Problem ist: Immer wenn ich die Rohdatendatei öffne und von ihr lese. Ich lese nur kleine Menge von Byte aus der Datei, ich weiß nicht wie viel, aber an einem bestimmten Punkt erhalte ich nur 0x00 Daten auf meinem Puffer.

Meine Vermutung: Ich glaube, das hat mit dem OS-Puffer zu tun, der eine bestimmte Menge an Puffer für Lese- und Schreiboperationen hat. Da könnte ich mich irren. obwohl ich nicht sicher bin, welche der Operationen nicht gut funktioniert, ist es entweder das Schreiben oder das Lesen.

Ich dachte zu schreiben \ lesen Sie die Rohdaten Char von Char oder Zeile für Zeile. Auf der anderen Seite enthält die Datei keinen Text, was bedeutet, dass ich Zeile für Zeile oder Zeichen für Zeichen nicht lesen kann.

Die Rohdaten Größe ist

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

, die in dieser Funktion

ist 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; 
} 

Die Methode funktioniert wie dieses

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

Hilfe sehr geschätzt S

würde

Antwort

0

Verwenden Sie die Boost IOstreams-Bibliothek. Es hat eine einfach zu bedienende wrrapers für die Dateiverarbeitung

Verwandte Themen