从ifstream中筛选不需要的元素
Filter unwanted elements from ifstream
当前我使用此模板方法读取文件并将内容存储到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();
}
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 更新的矢量元素不打印
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 使用 assimp 加载模型 - 不需要提升?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 返回不需要的值的二叉搜索程序
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 为什么map的元素不需要复制或移动构造函数,而vector需要?
- 一种方式链接列表和不需要的第一个元素AFRTER填充
- 从ifstream中筛选不需要的元素
- 将列表元素插入向量,C++获取其他不需要的值
- 通过使用不同的参数调用每个元素的非默认构造函数来初始化std::vector,而不需要进行不必要的复制
- Boost ptree add_child创建不需要的嵌套元素
- 不需要O(1)操作来连接两个forward_list中的元素