我在使用
Haskell和一般的函数式语言之后学习C,我发现我一直在努力解决同样的问题:
>从输入流中读取一些数据
>根据特定算法对它们进行标记
>处理令牌
如果这是Haskell,我可以简单地利用一切都是懒惰的事实,并在我考虑它时编写我的转换,然后它将在下游被消耗时应用.甚至还有一些库可以完成这种模式(conduit和pipes).
假设我想采用序列1 2 3 4 5 6 …并输出12 34 56 ….我可以看到如何编写在流上运行的ad-hoc代码并处理数据到位.但我想知道是否有一种抽象机制允许我通过从另一个流转换数据(以任何可想到的方式)来构建新流.这个抽象应该允许我在处理数据时缓冲数据,而不仅仅是将单个元素简单映射到新值.
以下是限制:
>我不能使用除stdlib之外的任何其他库.
>它必须在C 03上工作(意味着没有C 11功能.)
如果你在想,这是作业吗?好吧,我得到了很多课程作业,要求我处理数据流(这是没有库和C 03限制的原因).并不是我不知道如何使用while循环来做这件事,但我想知道stl中是否存在现有的流抽象,只是等待被发现和使用.
但如果唯一的方法是使用C 11,那么我想知道.
最佳答案 概念代码,未经测试.
成像有很多错误检查和正确的语法.
struct add : public std::binary_function<int,int,int> {
int operator() (int a, int b) {return (a + b);}
};
template<typename inType, typename dType, typename outType, class binFunc>
outType Transformer(inType& inStream, outType& outStream, binFunc func) {
dType a, b;
// Read some data from an input stream
// Tokenize them based on a specific algorithm
inStream>> a >> b;
//outStream << func(a, b);
return func(a,b); // Process the tokens
}
int main() {
std::ifstream in("input.dat", std::ifstream::in); // , std::ios::binary
std::ofstream out("output.dat");
struct add adder; // to Process the tokens
out << Transformer(in, out, adder);
return exit_success;
}