почему fputs и fprintf меняют порядок потоков

Я не понимаю, почему fputs и fprintf меняют порядок потоков.

int fputs (const char * str, FILE * stream);
int fprintf (FILE * stream, const char * format, ...);
ssize_t write(int fd, const void *buf, size_t count);

Я знаю, что fprintf перенаправляет поток для поддержки переменных аргументов, но почему серии fputs не сохраняют согласованность ???


person qianchenglong    schedule 15.01.2015    source источник
comment
Произошло это так давно, что я не уверен, что кто-то может дать ответ с абсолютной уверенностью. Мое личное убеждение состоит в том, что printf сделал это по необходимости (как вы уже заметили), а fputs, вероятно, к тому времени уже был установлен, поэтому изменение его места для соответствия было сочтено несостоятельным.   -  person Jerry Coffin    schedule 15.01.2015
comment
Скотт Мейерс только что выступил с докладом о дизайне API, в котором он выделил именно этот пример как неправильный [youtube. .com/watch?v=5tg1ONG18H8].   -  person Jeff Hammond    schedule 15.01.2015
comment
stdio вообще плохо спроектированная библиотека: с ней много других проблем.   -  person user207421    schedule 15.01.2015
comment
@EJP: я думаю, что плохой дизайн - это скорее ревизионистская история. Он был лучше, чем большинство других устройств того времени, и многие конструкции, которые некоторые теперь могут считать лучшими, могли вообще не работать на машинах того времени (даже телефоны теперь имеют гораздо больше памяти и более быстрые процессоры). чем даже самый быстрый мейнфрейм, когда он был разработан).   -  person Jerry Coffin    schedule 15.01.2015
comment
@JerryCoffin Вовсе нет. Помню, я так думал, когда впервые увидел его примерно в 1979 году. Пример: параметр размера в fwrite() означает, что если есть частичная запись, он не может сказать вам, сколько байтов было записано, только сколько элементов, так что вы никогда не можете знать про неполный элемент напишите. Лучше бы его не было. Другим примером является размещение параметров FILE * в конце, а не в начале. В то время существовали более совершенные API.   -  person user207421    schedule 15.01.2015


Ответы (1)


Поскольку эти вещи были написаны много десятилетий назад, это, как правило, представляет интерес только для историков :-)

Это было вероятно просто дизайнерское решение (или отсутствие решения), которое заставило их быть такими, и, поскольку ISO ценит обратную совместимость, они никогда не меняли его.

Может быть, что puts было написано первым, а когда пришло время писать fputs, разработчик просто вырезал и вставил его, прикрепив новый параметр в конец. Даже если бы такая же ситуация существовала для printf/fprintf, это было бы невозможно из-за необходимости, чтобы список переменных аргументов был в конце.

Но если оставить в стороне предположения, теперь, когда нашего любимого Денниса больше нет, мы можем никогда не узнать настоящих причин.

person paxdiablo    schedule 15.01.2015
comment
Да благословит Бог Денниса! Меня это просто интересует. Я всегда верил, что есть какая-то причина. Может быть, ты прав! Спасибо за ответ! - person qianchenglong; 15.01.2015
comment
Но, кажется, вызывает fputs(str, stdout) для вывода чего-то, поэтому fputs нужно разрабатывать раньше? Я не гарантирую это. - person qianchenglong; 15.01.2015
comment
@qianchenglong, puts сейчас может звонить fputs, но, как и вся история, тогда все могло быть совсем иначе :-) - person paxdiablo; 15.01.2015
comment
Если мне не изменяет память, большая часть библиотеки ввода/вывода на самом деле была спроектирована и разработана Майком Леском. Насколько я знаю, он все еще жив (но я совсем не уверен, что он точно помнит, почему параметры были упорядочены именно так, как они были для каждой функции). - person Jerry Coffin; 15.01.2015
comment
@JerryCoffin Я провел некоторое исследование в этом направлении. Я считаю, что порядок параметров в fputs, fread и fprintf был высечен в камне в Unix v7 в 1979 году, потому что в Unix v1 в 1971 году через Unix v6 в 1975 году I/ O примитивы были примерно неизменными и довольно примитивными: getw/getc/getchar/putc и тому подобное. Так что, если они действительно являются работой Леска, его меморандум 1972 года интегрировался 7 лет. fputs, вероятно, происходит от putc(c, iobuf). - person Iwillnotexist Idonotexist; 15.01.2015