Type-safe format string I/O functions similar to cstdio interfaces using C++20.
#include "include/ctfs.hpp"
int main()
{
// Prints "Hello 3 world".
ctfs::print<"Hello %d %s\n">(3, "world");
// Prints "value1: 005, value2: 2.30".
ctfs::print<"value1: %03d, value2: %.2f\n">(5, 2.3f);
int temp = 5;
// Prints "64bit-unsigned: 18446744073709551615, pointer: 0x...".
ctfs::print<"64bit-unsigned: %llu, pointer: %p\n">(UINT64_MAX, &temp);
// error: invalid conversion from ‘const char*’ to ‘int’
ctfs::print<"This will fail to compile: %d %d\n">(3, "");
char s[256]{};
// Write "sprint 4294967295 3.140000" to the buffer `s`.
ctfs::sprint<"sprint %u %f">(s, -1, 3.14);
puts(s);
// error: too few arguments to function
// ctfs::sprint<"fail to compile: %s %s">(s, "Hello");
FILE *f = fopen("./main.txt", "w");
// cat main.txt: "fprint 2.718 b"
ctfs::fprint<"fprint %g %c">(f, 2.718, 'a' + 1);
// error: too many arguments to function
// ctfs::fprint<"fprint %d %d %d">(f, 1, 2, 3, 4);
fclose(f);
int a, b;
ctfs::scan<"%d %d">(&a, &b);
ctfs::print<"%#x (%d) %#x (%d)\n">(a, a, b, b);
}
g++-11 -std=c++20
required to build.
It supports stdout functions (printf
, sprintf
, and fprintf
) and stdin functions (scanf
, sscanf
, fscanf
). However, widechar versions (wprintf
, ...) and detailed format specifiers for stdin functions are currently not supported.
MIT