-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAnysize_Reader.cpp
More file actions
66 lines (51 loc) · 1.3 KB
/
Anysize_Reader.cpp
File metadata and controls
66 lines (51 loc) · 1.3 KB
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
#include "stdafx.h"
#include "iostream"
#include "vector"
#include "string"
#include "map"
#include <algorithm>
#include <stdlib.h>
#include <time.h>
#include <stack>
#include <sstream>
#include <iomanip>
#include <random>
#include <assert.h>
using namespace std;
int block_reader(char* buf);
class CFileReader
{
public:
CFileReader() : m_nSize(0) {}
int anysize_reader(char *buf, int size);
private:
char m_buf[4096];
int m_nSize;
};
int CFileReader::anysize_reader(char *buf, int size)
{
assert(buf && size >= 0);
if (0 == size) return 0;
if (size <= m_nSize)
{
memcpy(buf, m_buf, size);
memcpy(m_buf, m_buf + size, m_nSize - size);
m_nSize = m_nSize - size;
return size;
}
memcpy(buf, m_buf, m_nSize);
buf += m_nSize;
int nLeft = size - m_nSize;
int nOrgSize = m_nSize;
m_nSize = block_reader(m_buf);
if (m_nSize != 4096 && nLeft > m_nSize)
{
memcpy(buf, m_buf, m_nSize);
return m_nSize + nOrgSize;
}
return nOrgSize + anysize_reader(buf, nLeft);
}
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}