LINUX.ORG.RU

Какие есть библиотека для вывода текста для Си, чтоб было похоже на std::cout?

 , ,


0

2

Есть ли какие-нибудь либы для Си, которые б позволяли похожим на cout образом делать вывод, чтоб ставить выводимую переменную в конкретно ту позицию, где я ее хочу вывести, чтоб без этих %d %f и прочего?

Нечто вроде:

uint16_t price = 100;
uint16_t quantity = 15;
my_print(STR, "Price :", UINT16, price, STR, "; quantity:", UINT16, quantity, END);

// аналог std::cout << "Price :" << price << "; quantity:" << quantity;

★★★★★

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

Это для C++, мне нужна библиотека на C.

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

Слишком шумно из-за кучи этих подряд идущих вызовов, так не годится.

Неужели придется самому такую либу писать?

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

Писать типы это намного менее шумно, чем писать вызов функции со скобочками и ;

Ну и тут еще смысл в том, что может быть нужно выводить что-то в шестнадцатиричном формате, а не в десятичном, так что это не столько про типы, сколько про формат вывода

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

Неужели придется самому такую либу писать?

Не видел существующих библиотек с такой функциональностью. Интерфейс, предложенный в начальном сообщении, можно реализовать следующим образом:

enum {
	END,
	STR,
	UINT16,
};

void my_print(int op, ...)
{
	va_list args;
	va_start(args, op);
	for (; op != END; op = va_arg(args, int)) {
		switch (op) {
		case STR:
			printf("%s", va_arg(args, const char*));
			break;
		case UINT16:
			printf("%u", va_arg(args, uint16_t));
			break;
		default:
			abort();
		}
	}
	va_end(args);
}
X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от rupert

http://libcello.org/home

На какие только извращения люди не пойдут, лишь бы не пользоваться C++. Причём всё это скорее всего работает в run-time а не compile-time, что создаёт дополнительные тормоза.

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

На какие только извращения люди не пойдут

В этом природа людей: извращаться.

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

На какие только извращения люди не пойдут, лишь бы не пользоваться C++.

Здрасте! ТС чем то не угодил printf, но никто даже не задался вопросом: чем? Вместо этого начали впаривать плюсы. Так что извращенца в зеркале увидите.

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

На какие только подвиги люди не пойдут, лишь бы не извращаться(пользоваться C++)

поправили, не благодари

anonymous
()

чтоб без этих %d %f и прочего?

А что с ними не так? Просто чувство прекрасного оскорбляют?

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

А что с ними не так? Просто чувство прекрасного оскорбляют?

То, что если писать типа в духе

printf("blabla %d blablabla %f blablablabla %d blabla bla %f blablabla %d", a, b, c, d, e);
то это не так наглядно, как если б можно было делать:
m_printf("blabla %d", a, " blablabla %f", b," blablablabla %d", c, " blabla bla %f ", d, " blablabla %d", e;)

В первом случае надо прилагать дополнительные усилия чтоб понять, какому %d %f или чему-то еще какая переменная соответствует. Второй вариант более читаем

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

Богородица не велит тебе писать:

printf("blabla %d", a);
printf("blablabla %f", b);
printf("blablablabla %d", c);
printf("blabla bla %f", d);
printf("blablabla %d", e);
printf("\n");

?

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

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

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

это было визуально близко к тому

Так вот же самое близкое:

printf(«blabla %d blablabla %f blablablabla %d blabla bla %f blablabla %d», ...

Любой другой вариант - уже отклонение в сторону.

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

Нет, я хочу чтоб у меня была выводимая переменная рядом с тем местом, где она фактически выводится, чтоб мне не надо было глазами искать, какому %f %d или чему-то там еще соответствует какая-то переменная с конца списка

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

я хочу чтоб у меня была выводимая переменная рядом с тем местом, где она фактически выводится

На самом деле ты хочешь шаблонные строки, типа

printf("The values of variables are: var1 = ${var1}, var2 = ${var2}, var3 = ${var3}");

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

Ну, или можешь заслать патчи в gcc / clang и пропозал в JTC1/SC22/WG14.

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

Ну-ну, попробуй попользуйся своими крестами с убогим STL каких-нибудь на контроллерах с 1 кб ОЗУ

SZT ★★★★★
() автор топика
Ответ на: удаленный комментарий

Мы еще и трансляторы на него писать будем в квадратах и жгутиках.

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

В vala есть такое(наверное во многих языках есть, просто vala компилится в С, поэтому и вспомнилось)

void main()
{
    int32 a = 5;
    double b = 5.5;
    string s = "Hi";
    stdout.printf(@"a=$a, b=$b, s=$s\n");
}
fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

В vala есть такое

Ну, вот да - как отдельный транслятор поверх поверх сишечки вполне себе. Вообще же, такое есть в любой скриптухе (с эксепшеном на опечатке в имени перменной, само собой).

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

Да, только надо будет вырубить исключения, RTTI и прочий шлак. И стандартной крестолибы там естественно не будет

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

Написал бы сразу, что у тебя 1 кб. Чтобы голову людям не морочить.

Lzzz
()
Ответ на: комментарий от LamerOk

На какие только извращения люди не пойдут, лишь бы не пользоваться C++.

Вообще-то идет. fmt скорее всего даже нет на всякого рода встройке, там вообще ничерта нет, все что выше 11 стандарта под вопросом и надо проверять, да и 11 скорее частичная реализация.

Опять же, это кусок std для форматирования и подготовки к выводу, а не для вывода, к io он не имеет отношения.

Наш друг хочет именно io

my_print(STR, "Price :", UINT16, price, STR, "; quantity:", UINT16, quantity, END);

// аналог std::cout << "Price :" << price << "; quantity:" << quantity;
anonymous
()
#include <stdio.h>

int main(){
    printf("%s%d%s%f", "bla = ", 4, ", blabla = ", .4f);
}

bla = 4, blabla = 0.400000

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

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

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

да так наглядно, но тогда придется как в python, не дай боже нарушить форматирование кода. Вообще наш друг явно подтраливает так как все решается еще проще, если у него действительно проблемы с порядком аргументов и сличением их «на глаз», всегда можно просто писать комментарий, тогда даже на форматирование в принципе плевать.

    printf(/*10*/"Hello World %d "  /*20*/ "%d " 
            /*30*/ "%d " /*40*/ "%d " /*50*/  "%d",
            10, 20 ,30, 40, 50);

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

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

Если у тебя там куча табличного вывода - значит, он довольно однообразный. Заведи функции типа print_line_XXX, print_line_YYY и не заглядывай в них больше.

suspend
()
Ответ на: комментарий от X512

Прям как в Паскале :-) Только типы уже в названиях функций заключены.

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

Так и в чём проблема? Вырубаешь исключения с RTTI и пишешь одну единственную шаблонную функцию. Тебе для поставленой задачи не нужна STL.

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

Кстати, вариант функции, которая выводит на печать все что ей передашь параметрами, есть ещё в K&R. Как люди пишут на си не зная наизусть K&R - для меня загадка

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

m_printf(«blabla %d», a, " blablabla %f", b," blablablabla %d", c, " blabla bla %f ", d, " blablabla %d", e;)

И что мешает написать?

#include <stdio.h>
#include <stdarg.h>
#include <string.h>

#define THE_END "!"
#define pr(...) pr_fn(0, ##__VA_ARGS__, THE_END)

void pr_fn(int fake, ...) {
        va_list args;
        const char * format;
        va_start(args, fake);

        while(1) {
                format = va_arg(args, const char*);
                if (0 == strcmp(format, THE_END))
                        break;
                vprintf(format, args);
        }

        va_end(args);
}


int main() {
        char * t = "test1";
        int d = 5;
        float f = 0.4f;

        pr("test string: %s", t, ", test int: %d", d, "! test float: %.4f\n", f);
        pr("test two args: %s %d", t, d, ", test float: %.4f\n", f);


}
vitus@dacha1:/tmp$ gcc t.c 
vitus@dacha1:/tmp$ ./a.out 
test string: test1, test int: 5! test float: 0.4000
test two args: test1 5, test float: 0.4000

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

Ну для больших форматных строк это может быть действительно визуально удобно, особенно если их регулярно приходится менять. Для логов при разработке тех же. Но это пусть аффтор решает - мне было тупо приколько вспомнить С :D.

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

Ну тут 100500 улучшений - я думаю топикстартер могЁт творчески подойти и сделать то что ему нужно. Это ж всё таки не js, что б такие вещи в виде библиотек хотеть.

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

Да, только надо будет вырубить исключения, RTTI и прочий шлак. И стандартной крестолибы там естественно не будет

Потому что они не нужны.

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

Как люди пишут на си не зная наизусть K&R - для меня загадка

«Смотрят в книгу, видят бабу»

anonymous
()

offtop

Здраститя, у вас был проект, вы писали статьи что-то там типа учебника по программированию... Забросили, передумали?

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

не проще ли написать генератор на bash’е с bash-измами?

«А это что за хуй рядом с Васей?»

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