--- tags: codebook --- {%hackmd theme-dark %} # filebufio ```cpp= #include<cstdio> #include<string> #include<cctype> using namespace std; constexpr size_t MAXN=1000000; struct fileio{ FILE *file; size_t len,cur; char buffer[MAXN]; operator bool(){return cur<len;} friend inline fileio& getline(fileio& buf,string& str,char delim=EOF){ str.clear();if(!buf){return buf;} while(buf.buffer[buf.cur]!='\n'&&buf&&buf.buffer[buf.cur]!=delim) {str.push_back(buf.buffer[buf.cur]);buf.cur++;}buf.cur++;return buf;} inline fileio& operator>>(int& re){ re=0;bool b=false; while(!isdigit(buffer[cur])){if(cur>=len){return *this;}b=(buffer[cur]=='-'?true:b);cur++;} while(isdigit(buffer[cur])){re=re*10+buffer[cur]-'0',cur++;} re=b?-re:re; return *this;} inline fileio& operator>>(long long& re){ re=0;bool b=false; while(!isdigit(buffer[cur])){if(cur>=len){return *this;}b=(buffer[cur]=='-'?true:b);cur++;} while(isdigit(buffer[cur])){re=re*10+buffer[cur]-'0',cur++;} re=b?-re:re; return *this;} inline fileio& operator>>(unsigned& re){ re=0;while(!isdigit(buffer[cur])){if(cur>=len){return *this;}cur++;} if(cur>=len){return *this;} while(isdigit(buffer[cur])){re=re*10+buffer[cur]-'0',cur++;}return *this;} inline fileio& operator>>(unsigned long long& re){ re=0;while(!isdigit(buffer[cur])){if(cur>=len){return *this;}cur++;} if(cur>=len){return *this;} while(isdigit(buffer[cur])){re=re*10+buffer[cur]-'0',cur++;}return *this;} inline fileio& operator>>(string& re){ re.clear();while(isspace(buffer[cur])) cur++; if(cur>=len){return *this;} while(isprint(buffer[cur])&&!isspace(buffer[cur])) {re.push_back(buffer[cur]),cur++;}return *this;} inline fileio& operator>>(char& x){ while(isspace(buffer[cur])) cur++; x=buffer[cur];return *this;} fileio(const string& str):cur(0){ file=fopen((str).data(),"rb"); len=fread(buffer,sizeof(char),MAXN,file); buffer[len]='\n',len++; buffer[len]=0,len++; fclose(file); } }; ```