Faster I/O in C

后端 未结 8 1924
自闭症患者
自闭症患者 2021-02-09 04:40

I have a problem which will take 1000000 lines of inputs like below from console.

0 1 23 4 5
1 3 5 2 56
12 2 3 33 5
...
...

I have used scanf,

8条回答
  •  一整个雨季
    2021-02-09 05:23

    You can greatly reduce the time of execution by taking input using fread() or fread_unlocked() (if your program is single-threaded). Locking/Unlocking the input stream just once takes negligible time, so ignore that.

    Here is the code:

    #include 
    
    int maxio=1000000;
    char buf[maxio], *s = buf + maxio;
    
    inline char getc1(void)
    {
       if(s >= buf + maxio) { fread_unlocked(buf,sizeof(char),maxio,stdin); s = buf; }
       return *(s++);
    }
    inline int input()
    {
       char t = getc1();
       int n=1,res=0;
       while(t!='-' && !isdigit(t)) t=getc1(); if(t=='-')
       {
          n=-1; t=getc1();
       }
       while(isdigit(t))
       {
         res = 10*res + (t&15);
         t=getc1();
       }
       return res*n;
    }
    

    This is implemented in C++. In C, you won't need to include iostream, function isdigit() is implicitly available.

    You can take input as a stream of chars by calling getc1() and take integer input by calling input().

    The whole idea behind using fread() is to take all the input at once. Calling scanf()/printf(), repeatedly takes up valuable time in locking and unlocking streams which is completely redundant in a single-threaded program.

    Also make sure that the value of maxio is such that all input can be taken in a few "roundtrips" only (ideally one, in this case). Tweak it as necessary.

    Hope this helps!

提交回复
热议问题