核心概述

快速读入用于将大块输入一次性读入缓冲并以指针解析,避免逐字符 I/O 的高常数开销,适合大规模数据读取场景。

原文引述

Description: Fast input by reading large chunks into a buffer and parsing numbers/strings from it. Avoids per-character overhead of std::cin/scanf, especially for large datasets.(摘自本节点现有英文注释) Time: O(1) amortized per number; overall O(input size)(摘自本节点现有英文注释) Status: tested(摘自本节点现有英文注释)

展开阐述

  • 定义与背景

    • 将输入按块读入固定大小缓冲(如 1MB),通过指针在缓冲内解析整数/字符串,降低系统调用频率与分支开销。
    • 典型用于 10^5~10^6 量级的整数/字符串读入。
  • 接口与语义(据本仓库节点示例风格)

    • 全局缓冲:static const int BUF_SIZE = 1<<20; static char buf[BUF_SIZE], *ptr = buf, *end = buf;
    • 读整型:跳过空白与符号位,按十进制累计构造数值;返回解析到的整数。
    • 读字符串:从当前非空白位置起读到下一个空白/换行处。
  • 核心流程与要点

    • 续充缓冲:当 ptr == end 时,调用 fread 读入下一块并重置指针。
    • 跳过空白:循环前移指针至首个非空白字符。
    • 解析流程:处理符号;循环累乘加位;过程中必要时续充缓冲。
    • 线程安全:全局缓冲非线程安全;多线程需各自维护缓冲。
    • 与输出混用:必要时 fflush(stdout) 以保证 I/O 顺序。
  • 示例片段(读整型)

inline int readInt() {
    int x = 0, f = 0;
    while (*ptr <= ' ') {
        if (++ptr == end) end = buf + fread(buf, 1, BUF_SIZE, stdin), ptr = buf;
    }
    if (*ptr == '-') f = 1, ++ptr;
    while (*ptr > ' ') {
        x = x * 10 + (*ptr - '0');
        if (++ptr == end) end = buf + fread(buf, 1, BUF_SIZE, stdin), ptr = buf;
    }
    return f ? -x : x;
}
  • 复杂度与边界

    • 摊还 O(1)/数;总计 O(输入规模)。EOF 时需返回约定值或做显式判定。
    • 缓冲区大小通常取 1<<20,可按环境调整。
  • 适用场景与扩展

    • 大量整数/浮点/字符串读入;在竞赛/批处理任务中显著降常数。
    • 可扩展支持 long long、浮点小数与指数部分、模板化多类型读取。

关联节点