Я хочу изменить некоторые printf
/sprintf
/fprintf
заявления в ostream
/sstream
/fstream
заявления. Код, о котором идет речь, печатает ряд целых чисел и чисел с плавающей запятой, используя пробел и фиксированные числа десятичных знаков.
Мне кажется, что это было бы хорошим кандидатом для написания в стиле Мартина Фаулера безопасного, поэтапного рефакторинга с важными замечаниями. Первый шаг, конечно, состоит в том, чтобы вставить унаследованный код в тестовый комплект, что я и сделал.
Какие медленные и осторожные шаги я могу предпринять, чтобы выполнить этот рефакторинг?
Если рефакторинг не является самоцелью, вы можете полностью избежать этого (ну, почти), используя библиотеку форматирования, такую как tinyformat который обеспечивает интерфейс, похожий на printf
но является безопасным типом и использует IOStreams внутри.
Основные механики конверсии:
printf
пункт стиля %w.pf
или же %w.pe
, где w
ширина поля и p
количество цифр точности, в << setw(w) << setprecision(p) << fixed
,printf
пункт стиля %wd
или же %wi
, где w
ширина поля, в << setw(w)
,"\n"
в endl
где уместно.Процесс для printf
:
char[]
(давайте назовем это text
) с достаточной общей шириной.printf(...)
в sprintf(text, ...)
и использовать cout << text
на самом деле печатать текст.Процесс для fprintf
:
printf
, но используйте соответствующие fstream
вместо cout
,
FILE
объект, который вы не хотите рефакторинг в это время, становится немного липкий (но осуществимо).Процесс для sprintf
:
stringstream
и потоковое содержимое char[]
ты пишешь в это. Если вы все еще собираетесь извлечь char*
из него можно сделать std::stringstream::str().c_str()
,Общие инструкции:
*printf
а также char[]
декларации по мере необходимости, когда закончено.