快速讀入輸出模板


fread快速讀入+fwrite快速輸出大法好。

實測比普通讀入優化快一倍,輸出不知道高到哪里去了。

/*
 * 快速讀入輸出模板     Au: Hatsune Miku
 * 用法:
 *       1. 在打開文件后立即調用init()函數初始化緩沖區。
 *       2. 讀入時請使用 read()讀入,可以讀入字符串(僅限字母)與數字。
 *       3. 輸出時請使用 print()輸出到緩沖區,可以輸出字符串、數字與字符。
 *       4. 在關閉文件前使用 flush()刷新緩存區(真正輸出到文件中)。
 * 函數返回值:
 *            1. 所有輸入操作均有返回值,返回真表示讀入成功,變量已被修改,返回假表示讀不到指定類型的數據,變量被清零;
 *            2. 所有輸出操作均無返回值,緩沖區自動刷新。
 *            3. 初始化函數無返回值,如果超出緩沖區會RE。
 * 玩得愉快!
*/
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<assert.h>
using namespace std;

const int InputBufferSize = 67108864;//輸入緩沖區大小
const int OutputBufferSize = 67108864;//輸出緩沖區大小 

namespace input
{
    char buffer[InputBufferSize],*s,*eof;
    inline void init()
    {
        assert(stdin!=NULL);
        s=buffer;
        eof=s+fread(buffer,1,InputBufferSize,stdin);
    }
    inline bool read(int &x)
    {
        x=0;
        int flag=1;
        while(!isdigit(*s)&&*s!='-')s++;
        if(eof<=s)return false;
        if(*s=='-')flag=-1,s++;
        while(isdigit(*s))x=x*10+*s++-'0';
        x*=flag;
        return true;
    }
    inline bool read(char* str)
    {
        *str=0;
        while(isspace(*s))s++;
        if(eof<s)return false;
        while(!isspace(*s))*str=0,*str=*s,str++,s++;
        *str=0;
        return true;
    }
}

namespace output
{
    char buffer[OutputBufferSize];
    char *s=buffer;
    inline void flush()
    {
        assert(stdout!=NULL);
        fwrite(buffer,1,s-buffer,stdout);
        s=buffer;
        fflush(stdout);
    }
    inline void print(const char ch)
    {
        if(s-buffer>OutputBufferSize-2)flush();
        *s++=ch;
    }
    inline void print(char* str)
    {
        while(*str!=0)print(char(*str++));
    }
    inline void print(int x)
    {
        char buf[25]= {0},*p=buf;
        if(x<0)print('-'),x=-x;
        if(x==0)print('0');
        while(x)*(++p)=x%10,x/=10;
        while(p!=buf)print(char(*(p--)+'0'));
    }
}

using namespace input;
using namespace output;

int num;

int main()
{
    freopen("data.in","rb",stdin);//請根據題目修改文件名
    freopen("data2.out","wb",stdout);//請根據題目修改文件名
    init();
    /*
       ...
       此處應有代碼。
       ...
       下面的代碼示例讀入一個數列,然后輸出這個數列。
       ``````````````````````````````````````
       ` int a;                             `
       ` while(read(a))print(a),print(' '); `
       ``````````````````````````````````````
    */
    while(read(num))print(num),print(' ');
    flush();
    return 0;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM