Как работает <iostream>? (C ++) - PullRequest
3 голосов
/ 22 мая 2009

Просто из любопытства, как iostream получает доступ к системе ввода-вывода. (У меня плохая привычка постоянно изобретать велосипед, и мне интересно, смогу ли я создать систему ввода-вывода, подобную iostream).

Ответы [ 4 ]

9 голосов
/ 22 мая 2009

Подробное руководство по потокам ввода-вывода см. В книге Стандартные потоки ввода-вывода C ++ и локали . После прочтения я подозреваю, что вы будете довольны управлением статус-кво - IOStreams, вероятно, самая сложная часть стандартной библиотеки C ++.

3 голосов
/ 22 мая 2009

Это зависит ...

Он как-то взаимодействует с собственной системой ввода-вывода операционной системы. Он может внутренне использовать библиотеку C, которая использует системные вызовы ядра, или он может использовать системные вызовы напрямую. Точная реализация сильно зависит от платформы.

Многие скажут, что не изобретайте велосипед, но это может быть хорошим опытом обучения. Если вы используете Windows, посмотрите на вызовы Win32 API для обработки файлов. Если вы используете Linux, либо используете библиотеку POSIX / C, либо используете системные вызовы (гораздо сложнее, я бы предложил использовать библиотеку C).

1 голос
/ 22 мая 2009

Все потоки идут в streambuf. Этот streambuf будет зависеть от типа потока. Ofstream идет к fstreambuf; cout переходит в какой-то неопределенный streambuf. Если вы хотите настроить вещи, cout позволяет вам получить этот потоковый буф и, возможно, заменить его.

Распространенным шаблоном является «фильтрация потокового буфера», который представляет собой интерфейс потокового буфера, который преобразует свои входные данные перед отправкой в ​​другой потоковый буф. Это может быть объединено с cout: вынуть оригинальный streambuf, обернуть его в фильтрующий streambuf и вернуть эту оболочку обратно в cout. Вам не нужно знать, как работает оригинальный streambuf. * ​​1003 *

1 голос
/ 22 мая 2009

Вы, конечно, могли бы изобрести колесо.

В потоковые операторы добавлено много сложностей для обработки международных наборов символов. После того, как я достаточно глубоко посмотрел на меня, мне было все равно. Это очень сложно и полностью уничтожает любые шансы легко использовать наследование. Это работает и доступно, хотя. (Я хотел изменить поведение хранилища, которое оно использует во время преобразований)

...