另类 fgets | lambda

renzhewh 2011-01-20 09:58:40

1、编写 fgets 函数的一个版本,叫做 tfgets,它 5s 钟过后会超时。
tfgets 函数接收和 fgets 相同的输入。如果用户在 5s 内不键入一个输入行,返回 NULL。
否则它返回一个指向输入行的指针。

2、下面是一段使用了 lambda 的用例,各位觉得这与 Boost.Lambda 库比较,如何?
#include <iostream>
#include <functional>
#include <vector>

int main()
{
using namespace std;

vector<int> v(10);
generate_n(v.begin(), v.size(), rand);

for_each(v.begin(), v.end(), [](int n) {
if (n % 2 == 0) cout << n << " "; });

return 0;
}
...全文
132 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
renzhewh 2011-02-13
  • 打赏
  • 举报
回复

上面的实现错了,只能用于控制台输入,至于其他文件就不行了
renzhewh 2011-01-25
  • 打赏
  • 举报
回复

根据 6#,使用 _kbhit(),但这是一种轮询方法,不知可有其他解决方法

char* tfgets(char *str, int n, FILE *stream)
{
long end = 5 * CLOCKS_PER_SEC + clock();

while (clock() <= end)
{
if (_kbhit())
return fgets(str, n, stream);
}

return NULL;
}
renzhewh 2011-01-22
  • 打赏
  • 举报
回复
以前都是命令式的,现在碰到函数式,总有点兴奋嘛
iambic 2011-01-22
  • 打赏
  • 举报
回复
2. 不如写个普通循环。即使是在lisp里,也没必要在这种情况下滥用closure。C++的lambda这么搓,反而用得起劲。
acdbxzyw 2011-01-21
  • 打赏
  • 举报
回复
1、根据cpu主频去测试并写出循环次数。。。然后kbhit();当然用api是最直接的方法。

shawn 2011-01-21
  • 打赏
  • 举报
回复
1.
通过alarm函数发送信号,如果超过5秒返回NULL,如果没有超过,取消alarm信号,返回指向输入行的指针。
2.
没用过Boost库 。。。
renzhewh 2011-01-21
  • 打赏
  • 举报
回复
to taodm
1、我想 Windows 提供了所需的 API
2、自由发挥
noock 2011-01-21
  • 打赏
  • 举报
回复
1) 同意楼上
2)这是C++ 0X的新标准,C++的原生特性当然比三方库好用了
taodm 2011-01-21
  • 打赏
  • 举报
回复
问题1,如果os没有提供带超时的同步调用api,或者异步调用API,那基本无法实现完美解。
问题2,你用了boost的lambda写了对比下,自己会有判断。就你这具体代码而言,差不多,所以对你试图问的,没有帮助。你甚至都没说比较啥?比较标准又是啥。
renzhewh 2011-01-21
  • 打赏
  • 举报
回复
我的是 Windowns 系统,最好是有源码

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧