我有特殊的输入输出技巧

在现在这个卡常遍地走的时代,正常的getchar(),putchar()已经无法满足各大OIer们的需求
于是巨佬们就发现了一些叫做fread(),fwrite()的东西
想要作死尝试的蒟蒻我就在今天早上BaiduGoogle了一下这个东西
然后就在P1001中WA了好几发。。。
人生一大污点

fread()

这个东西可以以字符串形式将输入文件中的东西一块一块的读进来,而且每次读取的速度贼快
当然,因为是以字符串形式,你要先定义一个ibuf[]数组来存这块里头读进来的东西

1
2
3
static const int _SIZE = 1 << 18 | 1;
static char *p1, *p2;
static char ibuf[_SIZE];

如果你怕读进来的空间不够大,那你可以考虑在重载一个getchar(),然后在里面一小块一小块读

1
2
3
4
5
6
7
char getchar() {
if (p1 == p2) {
p2 = (p1 = buf) + fwrite(ibuf, 1, _SIZE,stdin);
if (p1 == p2) return EOF;
}
return *p1++;
}

或者你极其有自信不会爆空间,你也可以这样一次读进来一整个,而且这样会比上面那个快
不过这个时候你数组空间当然要开大一点

1
2
3
4
5
6
7
8
9
static const int _SIZE = 1 << 26;

void init(){
ibuf[fread(ibuf, 1, _SIZE, stdin)] = '\0';
}

char getchar() {
return *p1++;
}

重载好getchar()之后就可以直接用之前那个read()乱水了

fwrite()

这个东西和fread()讲道理差不多。。还是一次性把所有东西全部扔进输出文件里
显然我们要开一个obuf[]来存我们要输出的东西

1
2
3
4
5
6
7
void putchar(char c) {
*p2++ = c;
}

void end() {
fwrite(obuf, 1, p2 - obuf, stdout);
}

template

这个东西嘛。。传说可以让你再也不用担心read(),write()里的变量没开大导致爆long long / unsigned long long
但我Google了半天发现这东西不能返回值。。只能传址调用
所以我们又要码风大改了

那我们最后扔一发板子以示友好?

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
#include <cstdio>

struct iostream {
static const int _SIZE = 1 << 26;
char *p1, *p2;
char ibuf[_SIZE], obuf[_SIZE];

iostream() : p1(ibuf), p2(obuf) {
#ifndef ONLINE_JUDGE
freopen("testdata.in", "r", stdin);
freopen("testdata1.out", "w", stdout);
#endif
ibuf[fread(ibuf, 1, _SIZE, stdin)] = '\0';
}

~iostream() {
fwrite(obuf, 1, p2 - obuf, stdout);
}

inline char getchar() {
return *p1++;
}

template <typename _T>
iostream & operator >> (_T &x) {
static char c = getchar(); x = 0; bool flag = 0;
while (c < '0' || c > '9') (c == '-') && (flag = 1), c = getchar();
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
(flag) && (x = -x);
return *this;
}

inline void putchar(char x) {
*p2++ = x;
}

template <typename _T>
iostream & operator << (_T x) {
static char buf[19]; register char *p3 = buf;
if (x != 0) {
if (x < 0) putchar('-'), x = -x;
while (x) {
*p3++ = x % 10 + '0';
x /= 10;
}
while (p3 != buf) putchar(*--p3);
} else putchar('0');
return *this;
}
} IO;

int main() {
return 0;
}