用 fread 進行 I/O 優化

記錄一下如何用 fread 把 input buffer 接過來自己管,以大幅優化 input 速度,純筆記。 (標題寫 I/O,但其實只有I,根本詐欺(?))

char get_char()
{
    static char buf[1000000], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1000000, stdin), p1 == p2) ? EOF : *p1++;
}
void get_short(short* u)
{
    static char c;
    short s = 1;
    while ((c = get_char()) < '0') {
        if (c == EOF) return;
        if (c == '-') { s = -1; c = get_char(); break; }
    }
    *u = c - '0';
    while ((c = get_char()) >= '0')
        *u = (*u << 3) + (*u << 1) + (c ^ '0');
    *u = *u * s;
}

使用方法:

short input;
get_short(&input);

Discussion and feedback