快速读入与输出

注意事项:

  • 需使用 c++11 及以上版本编译。
  • 确保引用 cstdiocctype 这两个头文件。
  • 请不要与其他任何输入输出方式混用。
  • 在终端中使用时输入结束需手动输入 EOF(Windows Ctrl+Z Linux Ctrl+D)。

非封装版

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
namespace IO
{
constexpr int bufsiz=1<<20;char stk[55];
char ibuf[bufsiz],*is=ibuf,*it=ibuf;
char obuf[bufsiz],*os=obuf,*ot=obuf+bufsiz;
inline void fetch(){is=ibuf,it=ibuf+fread(ibuf,1,bufsiz,stdin);}
inline char gc(){is==it?fetch():void();return is==it?'\0':(*is++);}
inline void flush(){fwrite(obuf,1,os-obuf,stdout),os=obuf;}
inline void pc(char x){os==ot?flush():void();*os++=x;}
struct Flusher{~Flusher(){flush();}}flusher;
template<typename T>
inline void qread(T&x)
{
x=0;char c=gc();bool f=0;
while(!isdigit(c)) f|=(c=='-'),c=gc();
while(isdigit(c)) x=x*10+(c-'0'),c=gc();
if(f) x=-x;
}
template<typename T>
inline void qwrite(T x)
{
char*pos=stk;if(!x) pc('0');
if(x<0) x=-x,pc('-');
while(x) *++pos=char(x%10+'0'),x/=10;
while(pos!=stk) pc(*pos--);
}
}

用法

  • 读入一个整数:

    1
    int n;IO::qread(n);

    读入有符号整数的对应的最小值可能会导致溢出。

  • 读入一个字符:

    1
    char c=IO::gc();

    该函数不会过滤空白字符

  • 输出一个整数:

    1
    IO::qwrite(12345678);

    输出有符号整数的对应的最小值可能会导致溢出。

  • 输出一个字符:

    1
    IO::pc('\n');
  • 刷新缓存区:

    1
    IO::flush();

    在程序正常结束时会默认调用 flush()

  • 可以修改 bufsiz 以修改缓存区大小。

额外部分

1
2
3
4
5
6
7
8
9
10
11
12
namespace IO
{
inline void qread(char&c){c=gc();while(!isgraph(c))c=gc();}
inline void qread(char s[]){char c=gc();while(!isgraph(c))c=gc();while(isgraph(c))*(s++)=c;*s='\0';}
inline void qwrite(char c){pc(c);}
inline void qwrite(const char s[]){while(*s)pc(*(s++));}
inline void qwrite(char s[]){while(*s)pc(*(s++));}
template<typename T,typename...args>
inline void qread(T&&x,args&&...arg){qread(x);qread(arg...);}
template<typename T,typename...args>
inline void qwrite(T x,args...arg){qwrite(x);qwrite(arg...);}
}

在加入了额外部分后,你可以:

  • 读入一个字符串:
    1
    char s[15];IO::qread(s);
    你需要自行保证数组不会越界。
  • 读入一个字符:
    1
    char c;IO::qread(c);
    该函数会过滤空白字符。这与 IO::gc 的行为不同。
  • 输出一个字符串:
    1
    IO::qwrite("Hello,World\n");
  • 输出一个字符:
    1
    IO::qwrite('\n');
  • 连续输入:
    1
    2
    int a,b,c;char d;char s[15];
    IO::qread(a,b,c,d,s);
    你可以传入任意多个参数,会从左至右依次调用匹配类型的 IO::qread
  • 连续输出:
    1
    IO::qwrite(1,2,3ll,' ',"\n");
    你可以传入任意多个参数,会从左至右一次调用匹配类型的 IO::qwrite

快速读入与输出
https://www.llingy.top/posts/3953568268/
作者
llingy
发布于
2024年2月26日
许可协议