一个类 iostream 的快读板子

注:目前没有进行长期测试,用崩了概不负责。

代码

stdin

struct _get_stdin {
   protected:
    const static int SIZE = (1 << 20) + 1;
    char Ib[SIZE], *I1 = Ib, *I2 = Ib;
    inline char getch() {
        if (I1 == I2 && (I2 = (I1 = Ib) + fread(Ib, 1, SIZE, stdin), I1 == I2))
            return EOF;
        else
            return *I1++;
    }

   public:
    _get_stdin &operator>>(char &res) {
        for (res = getch(); !isgraph(res); res = getch())
            ;
        return *this;
    }
    _get_stdin &operator>>(char *res) {
        char ch = getch();
        int cnt = 0;
        for (; !isgraph(ch); ch = getch())
            ;
        for (; isgraph(ch); ch = getch())
            res[cnt++] = ch;
        res[cnt] = 0;
        return *this;
    }
    template <typename Var>
    _get_stdin &operator>>(Var &res) {
        Var f = 1;
        res = 0;
        char ch = getch();
        for (; ch < '0' || '9' < ch; ch = getch())
            if (ch == '-') f = -1;
        for (; '0' <= ch && ch <= '9'; ch = getch())
            res = (res << 3) + (res << 1) + (ch ^ 48);
        res *= f;
        return *this;
    }
} in;

stdout

struct _get_stdout {
   protected:
    const static int SIZE = (1 << 20) + 1;
    char Ob[SIZE], *O1 = Ob, *O2 = O1 + SIZE - 1;
    int st[55], top = 0;
    inline void putch(char ch) { *O1++ = ch, (O1 == O2) ? flush() : void(); }

   public:
    ~_get_stdout() { flush(); }
    void flush() { fwrite(Ob, 1, O1 - Ob, stdout), O1 = Ob; }
    _get_stdout &operator<<(char ch) {
        putch(ch);
        return *this;
    }
    template <typename Var>
    _get_stdout &operator<<(Var *s) {
        int p = 0;
        for (; s[p] != 0; ++p)
            putch(s[p]);
        return *this;
    }
    template <typename Var>
    _get_stdout &operator<<(Var num) {
        if (!num) putch('0');
        if (num < 0) putch('-'), num = -num;
        for (; num; st[++top] = num % 10 + '0', num /= 10)
            ;
        for (; top; putch(st[top--]))
            ;
        return *this;
    }
} out;

stderr

struct _get_stderr {
   protected:
    const static int SIZE = (1 << 20) + 1;
    char Ob[SIZE], *O1 = Ob, *O2 = O1 + SIZE - 1;
    int st[55], top = 0;
    inline void putch(char ch) { *O1++ = ch, (O1 == O2) ? flush() : void(); }

   public:
    ~_get_stderr() { flush(); }
    void flush() { fwrite(Ob, 1, O1 - Ob, stderr), O1 = Ob; }
    _get_stderr &operator<<(char ch) {
        putch(ch);
        return *this;
    }
    template <typename Var>
    _get_stderr &operator<<(Var *s) {
        int p = 0;
        for (; s[p] != 0; ++p)
            putch(s[p]);
        return *this;
    }
    template <typename Var>
    _get_stderr &operator<<(Var num) {
        if (!num) putch('0');
        if (num < 0) putch('-'), num = -num;
        for (; num; st[++top] = num % 10 ^ 48, num /= 10)
            ;
        for (; top; putch(st[top--]))
            ;
        return *this;
    }
} err;

食用方法

cincoutcerr 相同。

使用时将 cin 替换为 incout 替换为 outcerr 替换为 err 即可。

目前仅支持各整型,字符与字符串(仅字符数组,暂不支持 std::string)读入输出。

暂不支持 endl,若需要刷新缓冲区请使用 flush(),如 out.flush()

目前还没有进行长期使用,可能会用出一些 bug。

Tips

如果你没有 using namespace std; 的习惯,你可以将每个 struct 后的 inouterr 改成 cincoutcerr,然后当作普通的 iostream 用。

由于 iostream 内置的流函数在 namespace std 内,这样使用不会冲突。如果需要调试,直接把 struct 定义的改个名,然后

using std::cin;
using std::cout;
using std::cerr;

即可。

因此,如果你平常使用流读入输出的话,可以很方便地切换到 fread

评论

  1. legendgod
    Windows Chrome 89.0.4389.90
    5月前
    2021-5-18 14:40:21

    tql

    • Ruakker 博主
      Windows Edge 90.0.818.62
      5月前
      2021-5-18 17:44:49

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇