C++ 从文本文件中查找和提取数据
我尝试搜索一个文本文件,并提取标题后的数据。然而,我在迭代器方面遇到了一些问题,我不知道如何克服 这是一个示例文本文件: 理想情况下,我想调用C++ 从文本文件中查找和提取数据,c++,algorithm,search,fstream,C++,Algorithm,Search,Fstream,我尝试搜索一个文本文件,并提取标题后的数据。然而,我在迭代器方面遇到了一些问题,我不知道如何克服 这是一个示例文本文件: 理想情况下,我想调用LoadData something.LoadData(“中继状态”)>缓冲区; 数据。推回(缓冲区); } 返回数据; } 据我所知,我的代码的主要问题是: 搜索是一个模棱两可的调用,我该如何解决这个问题 如果seekg(iit)是不合法的,我该如何让iit成为一个有效的论点 谢谢。嗯,我认为您的参数到std::search是个问题 std::se
LoadData something.LoadData(“中继状态”)然后让它返回一个带有{0,0,0,0,0,0,0,…}的std::vector
template<typename T> std::vector<T> CProfile::LoadData(const std::string& name)
{
std::ifstream ifs(FILE_NAME);
std::vector<T> data;
std::istreambuf_iterator<char> iit = std::istreambuf_iterator<char>(ifs);
std::search(iit, ifs.eof(), name.begin(), name.end());
std::advance(iit, name.size() + 1);
T buffer = 0;
for(ifs.seekg(iit); ifs.peek() != '\n' && !ifs.eof(); data.push_back(ifs))
{
ifs >> buffer;
data.push_back(buffer);
}
return data;
}
template std::vector CProfile::LoadData(const std::string&name)
{
std::ifstream ifs(文件名);
std::矢量数据;
std::istreambuf_迭代器iit=std::istreambuf_迭代器(ifs);
std::search(iit,ifs.eof(),name.begin(),name.end());
std::advance(iit,name.size()+1);
T缓冲区=0;
对于(ifs.seekg(iit);ifs.peek()!='\n'&&!ifs.eof();data.push_back(ifs))
{
ifs>>缓冲区;
数据。推回(缓冲区);
}
返回数据;
}
据我所知,我的代码的主要问题是:
- 搜索是一个模棱两可的调用,我该如何解决这个问题
- 如果seekg(iit)是不合法的,我该如何让iit成为一个有效的论点
谢谢。嗯,我认为您的参数到std::search是个问题
std::search(iit, ifs.eof(), name.begin(), name.end());
应该是
std::search(iit, std::istreambuf_iterator<char>(), name.begin(), name.end());
std::search(iit,std::istreambuf_迭代器(),name.begin(),name.end());
至于行:ifs.seekg(iit)
for
循环中的for不好,因为seekg期望某种类型的偏移量streampos
不是迭代器。所以它应该是ifs.seekg(0)
像这样的东西怎么样:
template<typename T> std::vector<T> CProfile::RealLoadData(std::istream &is)
{
std::string line;
std::vector<T> data;
while (std::getline(is, line))
{
if (line.empty())
break; // Empty line, end of data
std::istringstream iss(line);
T temp;
while (iss >> temp)
data.push_back(temp);
}
return data;
}
template<typename T> std::vector<T> CProfile::LoadData(const std::string& name)
{
std::string line;
std::ifstream ifs(FILE_NAME);
while (std::getline(ifs, line))
{
if (line == name)
{
// Found the section, now get the actual data
return RealLoadData<T>(ifs);
}
}
// Section not found, return an empty vector
return std::vector<T>();
}
template std::vector CProfile::RealLoadData(std::istream&is)
{
std::字符串行;
std::矢量数据;
while(std::getline(is,line))
{
if(line.empty())
break;//空行,数据结束
标准::istringstream iss(线);
温度;
而(iss>>温度)
数据。推回(温度);
}
返回数据;
}
模板std::vector CProfile::LoadData(const std::string和name)
{
std::字符串行;
std::ifstream ifs(文件名);
while(std::getline(ifs,line))
{
如果(行==名称)
{
//找到该部分,现在获取实际数据
返回RealLoadData(ifs);
}
}
//未找到节,返回空向量
返回std::vector();
}
标题和数据是否始终在单独的行上?单独行上的数据是否与所示示例中的数据相同?数据量是否总是相同的,或者如何跟踪数据量?如果数据来自2D数组,则与上面所述完全相同。要计算下载量,我必须阅读标题名称和“\n\n”之间的内容。在数据之后,始终有两个\n。感谢您的回复。你知道我如何设置iit指向的字符的偏移量吗?@user968243iit
是一个istream缓冲迭代器,它在内部从istream
的缓冲区获取字节(因此当你将iit
推进name.size()+1
时,它会从istream
的缓冲区读取那么多字节),它实际上没有任何位置。通过查看您的代码,我可以说,iit
通过name.size()+1
(因此它当前位于name.size()+1
)得到提升,因此您可以执行ifs.seekg(name.size()+1)
。
template<typename T> std::vector<T> CProfile::RealLoadData(std::istream &is)
{
std::string line;
std::vector<T> data;
while (std::getline(is, line))
{
if (line.empty())
break; // Empty line, end of data
std::istringstream iss(line);
T temp;
while (iss >> temp)
data.push_back(temp);
}
return data;
}
template<typename T> std::vector<T> CProfile::LoadData(const std::string& name)
{
std::string line;
std::ifstream ifs(FILE_NAME);
while (std::getline(ifs, line))
{
if (line == name)
{
// Found the section, now get the actual data
return RealLoadData<T>(ifs);
}
}
// Section not found, return an empty vector
return std::vector<T>();
}