从ifstream中筛选不需要的元素

Filter unwanted elements from ifstream

本文关键字:元素 不需要 筛选 ifstream      更新时间:2023-10-16

当前我使用此模板方法读取文件并将内容存储到std::vector:

template <class T> std::vector<T> FileToBuffer(const std::string pathToFile, std::vector<T> *ignoreList = NULL, bool binary = false)
    {                   
        std::vector<T> fileBuffer;      
        std::ifstream file;
        try
        {
            if(binary) file.open(pathToFile, std::ios::in | ios::binary);
            else file.open(pathToFile, std::ios::in);
            if (file)
            {
                // get length of file:
                file.seekg (0, file.end);
                int length = file.tellg();
                file.seekg (0, file.beg);
                fileBuffer.resize(length);
                file.read((char*)fileBuffer.data(), length);
                file.close();
                // remove unwanted elements
                if(ignoreList != NULL)
                {
                    for(std::vector<T>::iterator it=ignoreList->begin(); it!=ignoreList->end(); it++)
                    {
                        fileBuffer.erase(std::remove(fileBuffer.begin(), fileBuffer.end(), *it), fileBuffer.end());
                    }
                }
            }
        }
        catch(std::exception &exp)
        {
            fileBuffer.clear();         
        }
        return fileBuffer;
    }

为了过滤不需要的元素,我浏览了整个向量并将其删除!有没有更好的方法可以在读取过程中立即过滤掉不需要的元素?(事实上,我需要这个来去除换行和回车)

谢谢!

这应该有效:

if (file)
{
   T object;
   while ( file.read((char*)(&object), sizeof(T)) )
   {
      bool found = false;
      if(ignoreList != NULL)
      {
         auto iter = std::find(ignoreList->begin(), ignoreList->end(), object);
         found = (iter != ignoreList->end());
      }
      if ( !found )
      {
         fileBuffer.push_back(object);
      }
   }
   file.close();
}