Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从文本文件中查找和提取数据_C++_Algorithm_Search_Fstream - Fatal编程技术网

C++ 从文本文件中查找和提取数据

C++ 从文本文件中查找和提取数据,c++,algorithm,search,fstream,C++,Algorithm,Search,Fstream,我尝试搜索一个文本文件,并提取标题后的数据。然而,我在迭代器方面遇到了一些问题,我不知道如何克服 这是一个示例文本文件: 理想情况下,我想调用LoadData something.LoadData(“中继状态”)>缓冲区; 数据。推回(缓冲区); } 返回数据; } 据我所知,我的代码的主要问题是: 搜索是一个模棱两可的调用,我该如何解决这个问题 如果seekg(iit)是不合法的,我该如何让iit成为一个有效的论点 谢谢。嗯,我认为您的参数到std::search是个问题 std::se

我尝试搜索一个文本文件,并提取标题后的数据。然而,我在迭代器方面遇到了一些问题,我不知道如何克服

这是一个示例文本文件:

理想情况下,我想调用
LoadData something.LoadData(“中继状态”)
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指向的字符的偏移量吗?@user968243
iit
是一个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>();
}