LINUX.ORG.RU

почему в C++ используют потоки для ввода-вывода?

 ,


0

1

Прошу прощения за неосиляторство, но вот возникла необходимость написать небольшой модуль на SystemC, и понеслось.

1. Как я понимаю, по умолчанию в плюсах для I/O используется iostream?

2. Форматирование I/O делается с помощью «манипуляторов» типа std::hex, std::endl и прочих?

3. Почему, собственно, народу не угодили обычные libc-функции типа printf/sprintf/scanf?

В итоге код из-за использования iostream превращается в какую-то малопонятную кашу...

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 2)

Почему, собственно, народу не угодили обычные libc-функции типа printf/sprintf/scanf?

Сложнее добавить поддержку произвольных типов.

crowbar
()

Не нравятся потоки/не понимаешь, почему они лучше - никто не мешает сделать

#include <cstdio>
using std::printf;

//...
printf(...);
//...

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

std::printf входит в стандарт C++, не парься.

И да, много ситуаций, когда потоки удобны, или труднозаменимы чем либо. См. Protobuf, например

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

ну вот мне надо пакет распечатывать. Автор библиотеки за меня решил, в каком виде его распечатывать — типа жри, что дают?

Ну, там как-то так:

RMAPPacket p;
...
std::cout << p << std::endl;
...

И что, потоки только ради этого придумали?

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

данные в протоколе tcp - это поток байт, согласно стандарту. Многое другое тоже удобно представимо в виде абстракции stream.

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

Если тебя устраивает то, что дают (а в большинстве случаев это так) - жри что дают. Не устраивает - переопредели оператор << для этого типа. Код переписывать не придется. Совсем наркоман - выводи поля по одному, никто не запрещает.

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

Главное, чтоб потом не пришлось в пяти десятках файлов переписывать строки формата и списки параметров printf если поля надо будет местами поменять в выводе или, скажем, десяток новых полей добавить. Или, скажем, в файл выводить, а не в stdout.

roof ★★
()
Последнее исправление: roof (всего исправлений: 1)

1. Как я понимаю, по умолчанию в плюсах для I/O используется iostream?

«По умолчанию» ничего не используется. Как напишешь - так и будет.

2. Форматирование I/O делается с помощью «манипуляторов» типа std::hex, std::endl и прочих?

Если ты хочешь именно так - то да.

3. Почему, собственно, народу не угодили обычные libc-функции типа printf/sprintf/scanf?

С ними проще наделать опасных ошибок. Но тем не менее, никто не запрещает их использовать.

А вообще да, потоки - это самая кривая и нелогичная часть STL.

Deleted
()
Ответ на: комментарий от demidrol

Делай для каждого нужного типа функцию mystruct_snprint(char *str, size_t size, const mystruct *). Этим ты локализуешь сериализацию твоих типов; в потом использование в Xprintf() или в перегруженных operator<<() - дело техники

Deleted
()
Последнее исправление: Deleted (всего исправлений: 3)

На мой вкус, потоки ввода-вывода ужасны, пользоваться, а главное — в дальнейшем читать код с ними, крайне неудобно. Возможно они оказываются клевыми в каких-то задачах (тут говорят про протобуф, я не пользовался), но в качестве форматирования текста это п-ц. printf всем хорош кроме того, что не расширяется произвольными типами. Я однажды вдохновившись CL-овским format-ом сделал аналог на C++11 и до сих пор пользуюсь. В Qt есть вариации форматирования через QString().arg() — не интересовался на счет расширения своими типами, — в бусте тоже что-то есть, мне не понравилось, я уже не помню чем именно.

staseg ★★★★★
()

Ну так плюсеры — те еще мазохисты!

Eddy_Em ☆☆☆☆☆
()

ЕМНП из мемуаров Старструпа одна из причин, это избавиться от функций с переменным числом аргументов.

four_str_sam
()
friend std::ostream & operator << (std::ostream &, const MyClass &)

/thread

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

Возможно они оказываются клевыми в каких-то задачах (тут говорят про протобуф, я не пользовался), но в качестве форматирования текста это п-ц.

лютобешено плюсую.

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

не-не, мне для симуляции простенькой железки тащить Qt или Boost — это уж слишком.

Хватает того, что исходная либа в зависимостях имеет xerces-c.

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

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

Более того, в виде потока можно представить ту же строку, бинарный in database log, и ещё кучу чего, а оператор нужено будет реализовать только один. А иначе нужно будет реализовывать код как минимум с использованием fprintf и sprintf...

batbko
()
Ответ на: комментарий от demidrol

Ну да. Передаваемые аргументы лежат на совести программиста

four_str_sam
()
Ответ на: комментарий от demidrol

Я ни к чему не призываю, просто делюсь скудным опытом :)

staseg ★★★★★
()

В общем смотри «Дизайн и эволюция С++» глава 8.3.1. Коротко - контроль типов и вывод пользовательских типов

four_str_sam
()
Ответ на: комментарий от staseg

Я однажды вдохновившись CL-овским format-ом сделал аналог на C++11 и до сих пор пользуюсь.

Удваиваю этого товарища, самый удобный из известных мне способов. Правда, я вдохновлялся питоновским format-ом.

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

Сложнее добавить поддержку произвольных типов.

Что писать для каждого типа функцию to_string, что перегружать для него operator<<, разницы никакой.

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