printf и scanf ограничены тем, что вы не можете использовать свои собственные объекты с ними.
Если вы используете C ++, вам нужно немного узнать о потоках, потому что это стандарт языка. В C ++ вы можете создавать потоковые операторы для ваших собственных объектов и заставить их отлично работать с потоками.
Конечно, вы можете использовать boost :: format, но это будет только для форматированного вывода. Мне нравится boost :: format, и это очень полезно, например, когда вы используете локализацию (переводимые строки).