一个快读快写库,支持基本类型读写,指针地址写入,和 cin
cout
用法类似。
虽然相对于原版函数式 fread
快读会有点慢,但还是比 getchar
putchar
要快的。
fastio.cpp # 测试代码
fastio.h # FastIO 库源代码
fastio.beta.h # FastIO 库源代码,使用 C++20
fastio.in # 读写测试数据
-
using namespace fastio;
使用 FastIO。
-
using namespace fastio::symbols;
使用读写符号,如
endl
。 -
is >> n;
读取
n
。 -
is >> n >> m >> k;
读取
n
m
k
。 -
c = is.get();
is.get(c);
读取一个字符到
c
。 -
is >> s;
读取一个字符串
s
。 -
is.getline(s);
读取一行到
s
。 -
is.getline(s, end);
读取字符到
s
,一直读到end
停止。 -
is.get(s);
读取一行到
s
,但是把换行符保留在流中。 -
is.get(s, end);
读取字符到
s
,一直读到end
停止,但是把end
保留在流中。 -
is.ignore();
忽略一行。
-
is.ignore(end);
忽略字符到 c 停止。
-
while (is >> n) ;
一直读取直到末尾。
-
is >> bin;
is >> oct;
is >> dec;
is >> hex;
按 2、8、10、16 进制读取数。
-
is >> ws;
忽略前导空格。
-
is.setbase(n);
按
base
进制读取数$(2 \le base \le 36)$ 。 -
is >> reset;
取消前面的所有设置。
-
os << n;
写入
n
。 -
os << n << m << k;
写入
n
m
k
。 -
os.put(c);
写入一个字符
c
。 -
os << flush;
刷新流。
-
os << endl;
写入换行。
-
os << ends;
写入空格。
-
os << boolalpha;
设置写入
bool
时用true
false
。 -
os << noboolalpha;
设置写入
bool
时用0
1
。 -
os << showpos;
设置写入正数和 0 时前面加
+
号。 -
os << noshowpos;
设置写入正数和 0 时前面不加
+
号。 -
os << showpoint;
设置写入浮点数时总是添加小数点。
-
os << noshowpoint;
设置写入浮点数时不总是添加小数点。
-
os << fixed;
设置写入浮点数时严格保留
setprecision
时设置的位数。 -
os << defaultfloat;
设置写入浮点数时不严格保留
setprecision
时设置的位数。 -
os << bin;
os << oct;
os << dec;
os << hex;
按 2、8、10、16 进制写入整数。
-
os << lowercase;
写入特殊内容时使用大写。
-
os << uppercase;
写入特殊内容时使用小写。
-
os << showbase;
写入 2、8、16 进制的数时,在前面显示
0b
0
0x
。 -
os << noshowbase;
写入 2、8、16 进制的数时,不在前面显示
0b
0
0x
。 -
os << setbase(n);
按
base
进制写入数,超出范围默认 10 进制$(2 \le base \le 36)$ 。 -
os << setw(n);
设置下一次写入宽度若小于
width
,就填补字符(下一次写入重置)。 -
os << setfill(c);
设置
setw
填补的字符,默认为空格。 -
os << left;
设置
setw
填补的字符在左边。 -
os << right;
设置
setw
填补的字符在右边。 -
os << setprecision(n);
设置浮点数保留位数,默认保留 3 位。
-
os << reset;
取消前面的所有设置。
-
ifstream ifs(s);
创建文件读流,文件路径为
s
,和普通读流用法相同。 -
ofstream ofs(s);
创建文件写流,文件路径为
s
,和普通写流用法相同。
可以用接口来重载运算符。
注意要用 fastio::interface::istream
fastio::interface::ostream
来重载。
以下是重载 std::tuple
的示例程序。
using namespace fastio;
template <typename... TS>
interface::istream &operator>>(interface::istream &is, std::tuple<TS...> &a) {
std::apply([&](auto &&...args) { ((is >> args), ...); }, a);
return is;
}
template <typename... TS>
interface::istream &operator>>(interface::istream &is, std::tuple<TS...> &&a) {
std::apply([&](auto &&...args) { ((is >> args), ...); }, a);
return is;
}
template <typename... TS>
interface::ostream &operator<<(interface::ostream &os, std::tuple<TS...> const &a) {
std::apply([&](auto &&...args) { ((os << args << ' '), ...); }, a);
return os;
}