从ifstream过滤不需要的元素

时间:2015-03-06 06:49:44

标签: c++ file filestream

目前,我使用此模板方法读取文件并将内容存储到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;
    }

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

谢谢!

1 个答案:

答案 0 :(得分:0)

这应该有效:

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