fstream |读写操作既不好也不坏读写大文件

时间:2012-04-05 07:35:38

标签: c++ visual-c++ buffer

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

如果原始数据文件不存在,我的目标是解析XML

该方法的工作方式如下: 1.如果原始数据文件不存在:        解析XML文件并将数据保存到文件中。 2.如果原始数据文件存在 - 从文件中读取原始数据

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

我的猜测:我认为这与OS缓冲区有关,它具有一定量的缓冲区用于读写操作。我可能错了。虽然我不确定操作中的哪一个不能正常工作,但它可以是写入或读取。

我正在考虑写\通过char或逐行读取原始数据char。另一方面,该文件不包含文本,这意味着我不能逐行读取或按char读取char。

原始数据大小为

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

非常感谢帮助 S

1 个答案:

答案 0 :(得分:0)

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