LINUX.ORG.RU
решено ФорумTalks

Стандартные потоки ввода / вывода

 


0

1

Я о тех, что в Linux (точнее в POSIX).

Очень часто их называют stdin / stdout. Даже в этой вашей Википедии они так названы.

Но, судя по названию, stdin - это сокращение от std::cin (аналогично с stdout и std::cout) или от STDIN_FILENO/STDOUT_FILENO и пришло уже после самого стандарта из стандартных библиотек C/C++. В Википедии самый первый пример (50-х годов) на фортане и там используется UNIT=5 и UNIT=6 (уже позже INPUT_UNIT и OUTPUT_UNIT).

Так почему stdin - это «standard input stream», а не «input stream» или «UNIX input stream» или «console input stream» (последнее самое логичное).

Не считаете ли вы, что мир угнетен (а, может быть, уже и порабощён) сообществом сишников?

★★

А ещё, например, из Си во многие языки (и не только программирования, но и разметки типа JSON) пришли фигурные скобки для обрамления блоков. И что?

Удачные решения заимствуются, это нормальный процесс. STDIN и STDOUT куда понятнее, чем UNIT=5 и UINT=6 и при этом короче INPUT_UNIT и OUTPUT_UNIT, поэтому и закрепился. Скобочки хорошо визуально выделяют блоки (не сливаются с другим текстом) и при этом быстро набираются (в отличии от begin-end).

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от KivApple

И то. Что такое файловый поток (в mscorlib.dll так называется или назывался) понятно из названия. А что такое стандартный - нет. Стандартный для чего/кого?

«Поток ввода из стандартной библиотеки C» - вот это вот сокращение.

SaBo ★★
() автор топика

std::cin

Это уже более поздний C++. В C такого нет. В C, например, просто

#include <stdio.h>

int main()
{
        char buf[120];
        fgets(buf, 120, stdin);
        fputs(buf, stdout);
        return 0;
}
> ./test0
it works!
it works!

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

С std согласен - это плюсы.

Но есть STDIN_FILENO в unistd.h, которая в Debian'е входит в пакет glibc и реализует POSIX (отсюда и название, как я полагаю).

Т.е. STDIN - это не «standard input» (как написано в комментариях в том же unistd.h), а пространство имен STD (standard c library) + input. В stdlib.h мы видим макросы __BEGIN_NAMESPACE_STD и __END_NAMESPACE_STD.

Там ещё есть stdint.h, но мы же не говорим «standard int» - они вполне себе определены (int8 / int16 / uint и т.д.).

SaBo ★★
() автор топика
Ответ на: комментарий от KivApple

STDIN и STDOUT куда понятнее, чем UNIT=5 и UINT=6

Кстати, так-то в UNIX потоки 0 - in, 1 - out и 2 - error.

Так что UNIT=5 в каком-то смысле понятнее, чем STDIN. Я так предполагаю, что были ещё какие-то UNIT=1/2/3/4, но информации сходу не нарыл. Возможно это уже устарело по аналогии с «drive B» в винде.

SaBo ★★
() автор топика
Ответ на: комментарий от SaBo

Разработчики могут вводить какие угодно макросы, но unistd.h появился много десятилетий назад, и происходит от «UNIX standard library». А функции ввода-вывода находятся таки в «stdio.h» от «standard input/output». «stdin» - это «standard input», а «stdout» - «standard output». Здесь нет никаких отсылок к каким-то пространствам имён, которые через много лет появятся в C++. Просто разработчики стандарта языка посчитали функцию cin стандартной, а потому и поместили её в пространство имён std. Но, это уже другое «std».

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

Так я о том и говорю.

unistd.h появился много десятилетий назад, и происходит от «UNIX standard library»

Ну я про POSIX писал. В данном контескте не суть (да и мало уже кто помнит как там было).

Но суть в том, что

«stdin» - это «standard input», а «stdout» - «standard output»

Но standard здесь отсылка к «standard library», а не к «standard stream» так что, в общем смысле, называть потоки стандартными - не самая лучшая идея. Они стали «стандартными» уже после появления стандартной библиотеки C, а по факту являются потоками ввода вывода на терминал, в tty ну или что там сейчас. Точно такими же потоками ввода / вывода как и в файл.

SaBo ★★
() автор топика
Ответ на: комментарий от SaBo

Но standard здесь отсылка к <<standard library>>

Нет. «standard library» - это unistd.h, а stdin/stdout подключаются через stdio.h. Стандартным вводом/выводом могут быть не только монитор и клавиатура. Это могут быть любые символьные устройства. В т.ч. это всё исторически работало и с телетайпами, которые выводили на бумагу, и с терминалами где монитор и клавиатура неотделимы,... и т.д.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu

Стандартным вводом/выводом могут быть не только монитор и клавиатура. Это могут быть любые символьные устройства.

Ну... да. И об этом же я писал (под терминалам имел ввиду не GUI приложение). И tty оттуда же. А ещё сетевые потоки и т.д.

Нет. «standard library» - это unistd.h, а stdin/stdout подключаются через stdio.h

Википедия говорит про stdio.h следующее:

The C programming language provides many standard library functions for file input and output. These functions make up the bulk of the C standard library header <stdio.h>.[1] The functionality descends from a «portable I/O package» written by Mike Lesk at Bell Labs in the early 1970s.[2] and officially became part of the Unix operating system in Version 7.[3]

И:

The I/O functionality of C is fairly low-level by modern standards; C abstracts all file operations into operations on streams of bytes, which may be «input streams» or «output streams».

Т.е. это все же часть C и часть очень абстрактная - ввод и вывод.

Но правда частично, похоже, ваша. POSIX.1 описывает Standard C. Так что как названо в стандартной C, так же и в POSIX и в UNIX и LINUX. Т.е. в контексте UNIX потоки всё же правильно называть стандартными.

Но исторически это не так.

In the context of the ALGOL 68 programming language, the input and output facilities are collectively referred to as transput.

Это 68 год - задолго до C. Не задолго, а чуть раньше. Но задолго до POSIX.1 откуда идет стандартная библиотека C.

И только потом:

The ALGOL 68 transput library recognizes the following standard files/devices: stand in, stand out, stand errors and stand back.

SaBo ★★
() автор топика
Последнее исправление: SaBo (всего исправлений: 1)
Ответ на: комментарий от KivApple

пришли фигурные скобки для обрамления блоков. И что?

«Британские учёные» ещё не доказали, но я уверен, что {} вызывают красноглазие своими колющими загогулинами.

в отличии от begin-end

«begin» ненужен, а «end» короткий, если 3 символа лень, то можно использовать 1 визуально гладкий спец. символ, например ˩.

P.S. А грядущий мейнстрим — программирования смайликами Emojicode :)

quickquest ★★★★★
()
Ответ на: комментарий от quickquest

Задолбаешься набирать эти ваши смайлики. Фишка того, что в языках используется только ASCII в том, чтобы писать код без переключения раскладок и используя только символы, которые есть на любой клавиатуре.

KivApple ★★★★★
()
Ответ на: комментарий от SaBo

Стандартный в данном случае синоним «по умолчанию». Не знаешь откуда читать - читай из stdin. Не знаешь куда писать - выводи в stdout. А пользователь потом с помощью перенаправления ввода-вывода разберётся.

Плюс наличие этих 3 потоков (stdin, stdout, stderr) гарантируется стандартом POSIX (а даже WinAPI частично POSIX-совместим, если вспомнить хотя бы сокеты).

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Фишка того, что в языках используется только ASCII в том, чтобы писать код без переключения раскладок и используя только символы, которые есть на любой клавиатуре.

ASCII — ненужен, грамотные человеки, знающие буквы — ненужны, клавиатуры будут только со смайликами...

quickquest ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.