From 1b37bf40739272de5c953551dfa5705f35f9d3c9 Mon Sep 17 00:00:00 2001 From: orzcyand1317 <36555123+orzcyand1317@users.noreply.github.com> Date: Tue, 5 Mar 2019 13:19:45 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=20io.md=20=E4=B8=AD?= =?utf8?q?=E7=9A=84=E4=B8=80=E4=BA=9B=E7=BB=86=E8=8A=82.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- docs/misc/io.md | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/misc/io.md b/docs/misc/io.md index 8bc72810..ea5992b9 100644 --- a/docs/misc/io.md +++ b/docs/misc/io.md @@ -53,10 +53,9 @@ int read() { ch = getchar(); // 继续读入 } while (ch >= '0' && ch <= '9') { // ch 是数字时 - x = (x << 3) + (x << 1) + ch - '0'; // 将新读入的数字’加’在 x 的后面 - // x<<3==x*8 x<<1==x*2 所以 (x<<3)+(x<<1) 相当于 x*10 - // x 是 int 类型,char 类型的 ch 和 ’0’ 会被自动转为其 ASCII - // 表中序号,相当于将 ch 转化为对应数字 + x = x * 10 + (ch - '0'); // 将新读入的数字’加’在 x 的后面 + // x 是 int 类型,char 类型的 ch 和 ’0’ 会被自动转为其对应的 + // ASCII 码,相当于将 ch 转化为对应数字 ch = getchar(); // 继续读入 } return x * w; // 数字 * 正负号 = 实际数值 @@ -111,9 +110,9 @@ inline void write(int x) { 通过 `fread` 或者 `mmap` 可以实现更快的读入。其本质为一次性读入一个巨大的缓存区,如此比一个一个字符读入要快的多 ( `getchar` , `putchar` )。因为硬盘的多次读写速度是要慢于内存的,先一次性读到内存里在读入要快的多。 -更通用的是 `fread` ,因为 `mmap` 不能在 Windows 使用。 +更通用的是 `fread` ,因为 `mmap` 不能在 Windows 环境下使用。 - `fread` 类似于 `scanf("%s")` ,不过它更为快速,而且可以一次性读入若干个字符(包括空格换行等制表符),如果缓存区足够大,甚至可以一次性读入整个文件。 + `fread` 类似于参数为 `"%s"` 的 `scanf` ,不过它更为快速,而且可以一次性读入若干个字符(包括空格换行等制表符),如果缓存区足够大,甚至可以一次性读入整个文件。 对于输出,我们还有对应的 `fwrite` 函数 @@ -124,7 +123,7 @@ std::size_t fwrite(const void* buffer, std::size_t size, std::size_t count, std::FILE* stream); ``` -使用示例: `fread(Buf, 1, MAXSIZE, stdin)` ,如此从 stdin 文件流中读入 MAXSIZE 个大小为 1 的字符到 Buf 中。 +使用示例: `fread(Buf, 1, SIZE, stdin)` ,如此从 stdin 文件流中读入 SIZE 个大小为 1 的字符到 Buf 中。 读入之后的使用就跟普通的读入优化相似了,只需要重定义一下 getchar。它原来是从文件中读入一个 char,现在变成从 Buf 中读入一个 char,也就是头指针向后移动一位。 @@ -155,7 +154,7 @@ inline int rd() { if (c == '-') f = -1; c = gc(); } - while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = gc(); + while (isdigit(c)) x = x * 10 + (c ^ 48), c = gc(); return x * f; } char pbuf[1 << 20], *pp = pbuf; @@ -196,7 +195,7 @@ template inline T read(){ //声明 template 类,要求提供输入 T sum=0,fl=1;//将 sum,fl 和 ch 以输入的类型定义 int ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') fl=-1; - for(;isdigit(ch);ch=getchar()) sum=(sum<<3)+(sum<<1)+ch-'0'; + for(;isdigit(ch);ch=getchar()) sum=sum*10+ch-'0'; return sum*fl; } ``` -- 2.11.0