*printf vs. *puts

Ivan8209

Почему вместо "fputs(s, stdout)" пишут "printf("%s",s)"?
То есть, я понимаю, что последнее проще,
но почему так делают даже там,
где по каким-то причинам не положено использовать даже getopt?
---
...Я работаю антинаучным аферистом...

mira-bella

чьи-то глупые привычки

ppplva

Не такие уж и глупые, зачем нужны две функции, когда хватает одной. Если кому-то так удобнее - какие проблемы ?

Ivan8209

Достаточно fputc, если что.
---
...Я работаю антинаучным аферистом...

vall

флоаты ты тоже сам всегда выводишь?
printf потихоньку становится встроенной функцией, анализ константных шаблонов переносится на стадию компиляции.

rosali

Насколько я понимаю, printf заменяет \n на OS-dependent перенос строки (\r\n, \n, \r\n, ...) а fputs это так сказать "бинарный" вывод. А?

Ivan8209

Кстати, почему в стандарте не предусмотрели отдельных функций вывода чисел, по одному?
Наподобие strtoXXX, в обратную сторону.
---
Q24: Только ли unix suxx?
A24: Проявления suxx-а неисчислимы.

Ivan8209

Во-первых, ничто не мешает fputs производить ту же замену.
Во-вторых, бинарный вывод называеься fwrite.
Приложения:

NAME
fputs - put a string on a stream


NAME
fwrite - binary output

SUS v.2
Кстати, здесь, в первую очередь, OS = UNIX.
Конкретнее --- {Free,Net}BSD.
Но и других тоже касается.
---
...Я работаю антинаучным аферистом...

maggi14

> Во-вторых, бинарный вывод называеься fwrite.
и занимается он вовсе не выводом строк, пусть бинарных, а выводом областей памяти

mira-bella

Насколько я понимаю, printf заменяет \n на OS-dependent перенос строки (\r\n, \n, \r\n, ...) а fputs это так сказать "бинарный" вывод. А?
нет
fputs на текстовый поток (открытый не как "wb", а просто как "w") тоже конвертит '\n' в OS-dependent перенос строки, если вывод в бинарный поток - не конвертит соответственно. afaik *printf аналогично. Даже fread/fwrite конвертит <newline> в случае текстового файла и не конвертит в случае бинарного. (ISO/IEC 9899:1999)

mira-bella


NAME
fwrite - binary output

SUS v.2
а ты почитай SUSv3

Ivan8209

Навряд ли там сильно поменялось.
---
...Я работаю антинаучным аферистом...

mira-bella

Навряд ли там сильно поменялось.
по крайней мере нет неосторожных формулировок типа "binary output"
и довольно конкретно и четко описано поведение, в отличие от susv2

Ivan8209

Наглая ложь.
Точно так же "binary output".
С точностью до лишних пробелов.
---
"Истина грядёт --- её ничто не остановит!"

mira-bella

Точно так же "binary output".
С точностью до лишних пробелов.
да верно, туплю
но дальше самое интересное - из описания очевидно, что этот output не чуть не более binary, чем fputs и все остальное, потому что эквивалентен последовательности fputc(c).

shlyumper

Кстати, почему в стандарте не предусмотрели отдельных функций вывода чисел, по одному?
Наподобие strtoXXX, в обратную сторону.
Смотря в каком стандарте. Например:
SysV Release 2, X/Open Portability Guide 2: ecvt(3 fcvt(3).
В линуксе они есть. На FreeBSD вроде нет. Под виндой есть.

sergey_m

В SUSv3 написано, что это legacy.

shlyumper

это означает, что для совместимости с SUSv3 его реализовывать не обязательно?

sergey_m

> это означает, что для совместимости с SUSv3 его реализовывать не обязательно?
Legacy
The Legacy Option Group is denoted by the symbolic constant _XOPEN_LEGACY.
The Legacy Option Group includes the functions and headers which were mandatory in previous versions of IEEE Std 1003.1-2001 but are optional in this version.
These functions and headers are retained in IEEE Std 1003.1-2001 because of their widespread use. Application writers should not rely on the existence of these functions or headers in new applications, but should follow the migration path detailed in the APPLICATION USAGE sections of the relevant pages.

evgen5555

wprintf не аналогичен fputs.
Оставить комментарий
Имя или ник:
Комментарий: