willb (owner)

Fork Of

Revisions

gist: 163571 Download_button fork
public
Public Clone URL: git://gist.github.com/163571.git
Embed All Files: show embed
C++ #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
 
#include <deque>
 
#define MAX_LINE_LEN 1024
 
struct Poller
{
typedef std::deque<char *> LinesType;
typedef LinesType::const_iterator LinesTypeIterator;
typedef std::pair<LinesTypeIterator, LinesTypeIterator> LinesTypeIterators;
 
LinesType lines;
 
~Poller()
{
for (LinesType::iterator i = lines.begin();
i != lines.end();
i++) {
free(*i);
}
}
 
LinesTypeIterators
poll(FILE *f)
{
int size = lines.size();
 
char buf[MAX_LINE_LEN];
while (true) {
if (NULL == fgets(buf, MAX_LINE_LEN, f)) break;
lines.push_back(strdup(buf));
}
 
return LinesTypeIterators(lines.begin() + size, lines.end());
}
};
 
int
main(int argc, char **argv)
{
FILE *f = fopen(argv[1], "r");
if (!f) return 1;
 
Poller poller;
for (int c = 0; c < 10; c++) {
Poller::LinesTypeIterators ij = poller.poll(f);
for (Poller::LinesTypeIterator i = ij.first;
i != ij.second;
i++) {
printf("%s", *i);
}
 
sleep(1);
}
 
printf("All lines:\n");
for (Poller::LinesType::iterator i = poller.lines.begin();
i != poller.lines.end();
i++) {
printf("%s", *i);
}
 
fclose(f);
 
return 0;
}