LINUX.ORG.RU

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

В курсе, что сущесвует эта хрень, но она очень громоздкая. Именно это основная причина моей не любви к ней. Но сейчас хороший анонимус показал пример херости и принтф-а, да.

Она ни чуть не более громоздка, нежели корректно составленная маска формата. Ни разу. Даже менее. Зато она гарантированно type safe. Что начинаешь сильно-сильно ценить однажды напоровшись на эти грабли.

У стримового стиля форматирования есть минус совсем в другой области. А именно - он не позволяет делать инлайновые макросы, которые бы разрешали или запрещали вывод без вычисления аргументов.

bibi
()

После «чистого» Си плевался от этого синтаксиса и потоков, но потом привык. Но, всё-равно, *printf наше всё. =)

Insomnium ★★★★
()

Для себя особой разницы не заметил, чем больше вы пользуетесь?

Собственно сабж.

о, ё! ну шозавапрос... если ты одепт голого Цэ - юзай print'ы разные, коле Цэ-два-креста мил тебе - std::cout и до кучи потоки

ЗЫ и не надо тут компиляторосрач устраивать :)

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

Единственный минус иногда форматирование слишком длинное, да и endl; набирать лень :)

сделай макрос :)

#define PRINT(some) std:: cout << some << std::endl;
shty ★★★★★
()
Ответ на: комментарий от Reset

с синтаксисом iostreams сам черт ногу сломит

4.2 даже студенты осиливают

а кто такой чёрт вообще ниразу ниясно

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

>... а нахрена срач в девелопменте то разводить? Толксов мало? Или звездочек?

вот.

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

ну а вообще, если уж срач, то есть Console::WriteLine(), а все ваши printf'ы и cout'ы мирно курят в сторонке, пока лавры достаются победителю.

о как!

mono ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

printf - наше фсьйо, т.к. например записать 5 чисел %i%i%i%i%i и << int << int << int << int << int << вопросы? :)

Э стой. Стой говорю! Ты ваще с какого района?

bibi
()

С printf писать меньше, но у плюсовых потоков есть огромный плюс — туда можно писать всё без лишних забот. Некоторые вещи с printf просто не сделать:

template <class T>
void
some_proc(const T& a, const T& b)
{
    ...
    std::cerr << "DEBUG: a = " << a << '\n';
    ...
}

undet
()

>Что вы предпочитаете: fprint или cout ?

(format nil «~:d» somevar)

</thread>

anonymous
()
Ответ на: комментарий от bibi

> Нормальную подсистему логирования.

плюсую

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

Ага, а некоторые интернет wget'ом смотрят.

Ну ка, напиши мне с ходу аналог вот такого на iostream

printf("A[%04d]=%23.16lf\n", i, A[i]);

а потом заодно посчитай количество кода и оцени читабельность.

Если ты iostream аналог можешь с ходу написать и для тебя он выглядит нормально и читабельно, то я могу сделать только один вывод — тебе пора в психушку.

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

+1 Жду нормального примера как это будет с iostream. Оно мне показалось очень грамозким.

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

о, ё! ну шозавапрос... если ты одепт голого Цэ - юзай print'ы разные, коле Цэ-два-креста мил тебе - std::cout и до кучи потоки.

В том и дело, что работал с printf, но т.к. пишу в с++ решил перейти на cout и ужаснулся.

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

Под палкой чтоль заставляют использовать в с++ именно «плюсовые» конструкции вместо «сишных» ? Использовать надо то, что удобно.

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

которая называется syslog и имеет синтаксис printf'а :)

Не факт, что это именно syslog. Уж больно он тормозной для более-менее приличного потока данных (10ки тысяч сообщений в секунду). А ведь иногда, скажем, при отладке бывает нужен и такой трафик. Впрочем, в своей области он вполне применим.

Что же до синтаксиса printf-а - у него есть свои очевидные плюсы и минусы.

bibi
()
Ответ на: комментарий от Reset

>printf(«A[%04d]=%23.16lf\n», i, A[i]);

Чё это за срань? Я man printf давно забыл и не намерен вспоминать без большой нужды. Поясни по русски что оно делает, тогда перепишу на iostream.

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

> В том и дело, что работал с printf, но т.к. пишу в с++ решил перейти на cout и ужаснулся.

Что же ужасного. Защищеность от твоих ошибок - это раз. Более высокая скорость вывода - это два. Меньше объем кода и оптимизация выше

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

лучше так

printf("A[%04d]=%23.16le\n", i, A[i]);

%04d — печатать число типа int, ширина поля 4 символа, вместо пустых символов печатать нули. Выглядеть будет так.

0001
0123
0023

%23.16le — печатать число типа double, ширина поля 23 символа, после запятой 16 знаков. Выглядеть будет так

 1.3000000000000000e+00  4.4444444444444450e+14

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

> А ведь иногда, скажем, при отладке бывает нужен и такой трафик.

Это вам в консерватории чё-то надо поправить.

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

> Защищеность от твоих ошибок - это раз.

Есть такое, но gcc пишет warning'и.

Более высокая скорость вывода - это два.

сомнительно

Меньше объем кода

4.2

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

> Есть такое, но gcc пишет warning'и.

Ага. И еще граница всякие проверяет. еще люббят напистаь

char str[10000];

scanf(«%s», str);

printf(str);

namezys ★★★★
()

На С g_print.

На С++ std::cout. Форматирую Glib::ustring::compose или Glib::ustring::format

vertexua ★★★★★
()

Теперь понятно, откуда повсюду срачи с заявами «ц++ - уг, ц рулит».
Все просто пишут на ц в классах.

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

> scanf(«%s», str); -> scanf(«%255s», str);

Ага. А что это коде спасет если я в ответ на ввод строки введу «%D%D%D%D%D%D%D%D%D%D%D%D%D»

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

Смотря как кормить, если так printf(«%s», buf), то ничего не будет.

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

Ну ка, напиши мне с ходу аналог вот такого на iostream

printf("A[%04d]=%23.16lf\n", i, A[i]);

велкам

std::cout << "A[" << std::setw(4) << i << "] = " << std::setprecision(39) << A[i] << std::endl;

давно printf не использовал, надеюсь всё правильно понял :)

а потом заодно посчитай количество кода и оцени читабельность.

не, не, не - не надо подменять тему, вопрос был в том сложно это или просто осознать - нет, не сложно

да, в таком примере больше кода написать надо - никто не спорит

но в эту игру можно играть вдвоём, изобразите с помощью printf вот такое

	template <typename Ty> 
	bool from_string(
		Ty& t_out, const std::string& string_in,
		std::ios_base& (*base_to)(std::ios_base&) = std::dec
		) {
			std::istringstream iss(string_in);
			return !( iss >> base_to >> t_out).fail();
	}

	template <typename Ty> 
	bool to_string(
		std::string& string_out, Ty& t_in, 
		std::ios_base& (*base_to)(std::ios_base&) = std::dec
		) {
			std::ostringstream oss;

			oss << base_to << t_in;
			string_out = oss.str();

			return true;
	}
shty ★★★★★
()
Ответ на: комментарий от Zodd

работал с printf, но т.к. пишу в с++ решил перейти на cout и ужаснулся.

просто не привык :) надо больше практики

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

Это вам в консерватории чё-то надо поправить.

Это скорее ты не встречался с отладкой трафикастых систем. Когда за секунду через сервис в параллель проходит десятки или сотни тысяч разнообразных транзакций и где-то там глубоко-глубоко живет Страшный Баг который умеет хорошо прятаться и его нужно отловить.

bibi
()
Ответ на: комментарий от namezys

Это не ошибка, это говнокод.
Нужно выводить логи, формировать строки и тп - напишите обертку и трахайтесь со своими *print* в одном месте.

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

> давно printf не использовал, надеюсь всё правильно понял :)

Во первых это уже страшный ужас, а во вторых это всё неправильно. В квадратных скобках пустые поля должны быть заполнены нулями, а %23.16le должен быть распечатан именно так как я написал, то есть после запятой 16 знаков, ширина поля 23.

но в эту игру можно играть вдвоём, изобразите с помощью printf вот такое

а нахера? мне религия не запрещает использовать lexical_cast

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

upd: если что, это функции конвертации строку в число и обратно, с учётом основания (двоичное, восьмеричное, десятичное, шестнадцатеричное)

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

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

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

давно printf не использовал, надеюсь всё правильно понял :)

Во первых это уже страшный ужас

понятно, слабые духом не используют stl :)

во вторых это всё неправильно [..] после запятой 16 знаков, ширина поля 23

fix:

std::cout << "A[" << std::setw(4) << i << "] = " << std::setw(23) << std::setprecision(16) << A[i] << std::endl;

В квадратных скобках пустые поля должны быть заполнены нулями

несущественная деталь, можно добавить std::setfill('0') и всё будет хорошо

> но в эту игру можно играть вдвоём, изобразите с помощью printf вот такое

а нахера?

понятно, значит не можете :) а вообще, хороший способ ведения спора - я теперь с Вами тоже так разговаривать буду :)

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

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

и названия функций, такие ни о чём не говорящие, да :)

strtol как-то понятнее и основание можно задвать любое.

не уводите спор в сторону, это не очень честный приём :)

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

> понятно, слабые духом не используют stl :)

stl используем во всю, а вот недоразумение под названием iostream - нет

несущественная деталь, можно добавить std::setfill('0') и всё будет хорошо

И будет еще больше нечитабельного кода.

понятно, значит не можете

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

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

кроме того, с помощью std::cout можно написать вот так

std::cout << myCustomContainer << std::endl;

в случае же с printf придётся ковыряться - тоже не очень гуд

PS я к тому что переопределение operator<< - даёт в руки мощный инструмент

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

> в случае же с printf придётся ковыряться - тоже не очень гуд

И так и так придется ковыряться. Или переопределение << возьмется из астрала ?

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

понятно, слабые духом не используют stl :)

stl используем во всю, а вот недоразумение под названием iostream - нет

так, записываем по буквам: н-и-а-с-и-л-и-л-и

будет еще больше нечитабельного кода.

он нечитабельный только для Вас, потому как опыта не хватает :)

> понятно, значит не можете

Я могу, только принципиально не буду этого делать.

охохо, во-первых, как с помощью printf Вы это сделаете - очень интересно :)

а Ваша аргументация такая классическая, классическая тролльская

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

в случае же с printf придётся ковыряться - тоже не очень гуд

И так и так придется ковыряться. Или переопределение << возьмется из астрала ?

Вы и правда не видите разницы?

давайте так:

с помощью std::cout выводим A[33, 22, 11] написав

std::cout << "A[" << myCustomContainer << "]" << std::endl;

а в случае с printf?

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

> охохо, во-первых, как с помощью printf Вы это сделаете - очень интересно :)

переопределит оператор приведения типа?

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

> так, записываем по буквам: н-и-а-с-и-л-и-л-и

Ты в машинных кодах программируешь? Нет? Значит тоже неасилил.

он нечитабельный только для Вас, потому как опыта не хватает :)

Бугага. Ты в машинных кодах программируешь? Нет? Видимо кому-то опыта не хватает.

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