Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++ 基于boost::tuple构建一个regexp,使用fscanf读取文件_C++_Boost - Fatal编程技术网

C++ 基于boost::tuple构建一个regexp,使用fscanf读取文件

C++ 基于boost::tuple构建一个regexp,使用fscanf读取文件,c++,boost,C++,Boost,我有几个数据文件,可以包含不同类型的数据。 例如,我可以有一个文件:int double: 1,2,0.5 1,3,0.7 或int char[16]-双精度: 1,15c48e7d3a4857bb,0.1 2,49b49e45f46aa45b,0.3 我想建立一个对象,可以被认为是一个通用的读者。我只想提供一个boost::tuple类型,对象必须能够给我一个适当的正则表达式,以便使用fscanf读取文件 该对象的基本代码为: template <typename T>

我有几个数据文件,可以包含不同类型的数据。 例如,我可以有一个文件:int double:

1,2,0.5
1,3,0.7    
或int char[16]-双精度:

1,15c48e7d3a4857bb,0.1
2,49b49e45f46aa45b,0.3
我想建立一个对象,可以被认为是一个通用的读者。我只想提供一个boost::tuple类型,对象必须能够给我一个适当的正则表达式,以便使用fscanf读取文件

该对象的基本代码为:

template <typename T>
class reader_t<typename T>
{
  ...
  std::string regexp() const;
}
我看了一遍地图,但没有找到我需要的东西


有人有想法吗?

< P>我不是这个方面的专家,但是一些C++模板元编程怎么样? 举个例子:

template<class T> struct x {
    static const char a = '\0';
    static const char b = '\0';
};

template<> struct x<int> {
    static const char a = 'd';
    static const char b = '\0';
};

template<> struct x<double> {
    static const char a = 'l';
    static const char b = 'f';
};
模板结构x{
静态常量字符a='\0';
静态常量字符b='\0';
};
模板结构x{
静态常量字符a='d';
静态常量字符b='\0';
};
模板结构x{
静态常量字符a='l';
静态常量字符b='f';
};
您可以使用它创建如下字符串:

string test;
test = "%" + x<int>::a + x<int>::b + ",";
test += "%" + x<int>::a + x<int>::b + ",";
test += "%" + x<double>::a + x<double>::b;
字符串测试;
test=“%”+x::a+x::b+”,“;
测试+=“%”+x::a+x::b+”,“;
测试+=“%”+x::a+x::b;

您可能希望为a、b和x找到更好的名称,并且可能需要了解如何从a
boost::tuple
中提取类型

这应该让您开始:

#包括
#包括
#包括
#包括
#包括
命名空间详细信息{
结构读取器\u t\u帮助器
{
typedef std::DEF蓄能器;
模板
结构格式累加器
{
静态void add(reader\u t\u helper::acculator\u t&fmts)
{
reader\u t\u helper::format\u acculator\u impl(fmts);
reader\u t\u helper::format\u accumulator::add(fmts);
}
};
模板
结构格式累加器
{
静态void add(reader\u t\u helper::acculator\u t&fmts)
{
reader\u t\u helper::format\u acculator\u impl(fmts);
}
};
私人:
模板结构图\u调度器;
模板
静态无效格式\u累加器\u impl(读卡器\u t\u助手::累加器\u t&fmts)
{
typedef typename boost::tuples::element::type elem\u t;
fmts.push_front(reader_t_helper::map_dispatcher::map());
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%hi”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%hu”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%i”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%u”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%li”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%lu”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%lli”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%llu”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%f”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%lf”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态标准::字符串常量fmt(“%Lf”);
返回&fmt;
}
};
模板结构读取器\u t\u帮助程序::映射\u调度程序
{
静态标准::字符串常量*映射()
{
静态std::string const fmt(map_dispatcher::init());
返回&fmt;
}
私人:
静态std::string init()
{
std::ostringstream oss;

oss如果你已经在使用boost,难道你不能使用boost的一些神奇字符串标记化和词法转换功能,而不是回到
scanf
?这个神奇的正则表达式创建者怎么知道你的第二个例子是
int,char[16],double
而不是
int,int(十六进制编码),double
?或
string,string,string
。您有那么多不同的格式吗?据我所知,boost字符串标记化非常慢。我正在处理10亿行文件…可能我不清楚:我指定了类型(在本例中),我不希望编译器猜到。我需要的是“给定一个类型,给我regexp”@paragoon:你能给出一个完整的、最简单的例子来说明你希望发生什么吗?在你当前的问题中,没有提到任何正则表达式或元组,尽管你有“tuple”和“regexp”"在title.fscanf?你疯了吗?使用iostreamThanks,我想到了类似的结构,但你已经指出了主要问题:能够从boost::tupleThanks中提取类型,以增强作为一个非常好的库,它:
element::type
提供了第n个元素类型,如果T是元组类型。令人印象深刻。非常感谢你的answer
"%d,%d,%lf\n"
template<class T> struct x {
    static const char a = '\0';
    static const char b = '\0';
};

template<> struct x<int> {
    static const char a = 'd';
    static const char b = '\0';
};

template<> struct x<double> {
    static const char a = 'l';
    static const char b = 'f';
};
string test;
test = "%" + x<int>::a + x<int>::b + ",";
test += "%" + x<int>::a + x<int>::b + ",";
test += "%" + x<double>::a + x<double>::b;