Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Возможно ли в С вывести что-нибудь в консоль, не используя stdio.h?

#c #printf


Возможно ли в С вывести что-нибудь в консоль, не используя stdio.h, printf?
    


Ответы

Ответ 1



stdio.h - это буферизированная надстройка над базовыми функциями ввода-вывода read, write, объявленными в unistd.h. #include write(1, "Hallo!\n", sizeof "Hallo!\n" - 1); Первый аргумент - файловый дескриптор - номер в таблице открытых файлов исполняемой программы. При запуске по стандарту заранее открыты три дескриптора: 0 - стандартный ввод, 1 - стандартный вывод, 2 - стандартный вывод ошибок. В некоторых системах могут быть ещё другие. fwrite из того же stdio.h. Работает похожим образом, но через тот же буфер, как и printf: #include fwrite("Hallo!\n", sizeof "Hallo!\n" - 1, 1, stdout); Хотя она и вызывает write, но за счёт буферизации часто оказывается быстрее при записи большого количества данных в файл (при перенаправлении вывода). Безусловно fwrite быстрее printf, так как последняя ищет в строке форматные последовательности, начинающиеся со знака %. fputs и puts из stdio.h выводят строку, оканчивающуюся нулевым байтом ('\0'). Вторая добавляет ещё и символ конца строки и выводит только на стандартный вывод. #include fputs("Hallo!\n", stdout); puts("Hallo!"); // выводит то же самое, что и предыдущая функция По скорости должны быть как fwrite, но отличаются способом определения длины строки, поэтому с их помощью невозможно вывести сами нулевые байты. Мои измерения в ubuntu однако показывают, что puts почему-то намного медленнее fputs и почти как printf.

Ответ 2



В дополнение к POSIX write(2) и Win32 WriteConsoleW() можно упомянуть функции, которые также позволяют выводить в консоль: Библиотечные функции, объявленные в conio.h, весьма различались в зависимости от компилятора. Первоначально реализованные в Microsoft Visual C++ различные функции привязывались напрямую к нескольким первым функциям DOS, связанным с прерыванием 21h. Но библиотека, поставляемая с Turbo C++ и Borland C++, не использует DOS API, а вместо этого напрямую обращается к видеопамяти для вывода информации и использования сигналов прерывания BIOS. #include putch('A'); Также (зависит от железа, ОСи) можно выводить символы на экран с помощью прямой манипуляции памяти, которая отображена на видео буфер. Из книги "Computer Graphics Primer", написанной Mitchell Waite и опубликованной в 1979: IBM VGA BIOS (mode 13h) режим предоставляет похожий доступ к видеопамяти как к 320×200 массиву пикселов с 256 цветами. Обычно между программой и видеопамятью присутствует множество уровней абстракции. На Linux, если X не запущен(или в Ctrl+Alt+Fx виртуальной консоли), можно mmap /dev/fb0 устройство (Linux framebuffer всего на ступеньку выше работы с видеокартой напрямую—интерфейс предоставляется самим ядром): fbdev = open("/dev/fb0", O_RDWR); buffer = mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbdev, 0); Здесь buffer—это массив байтов размером screensize, запись в который позволяет рисовать в консоли, например, в режиме 1600x1200 32bpp (screensize = 1600*1200*32/CHAR_BIT), чтобы закрасить выбранный пиксель ярко жёлтым (красный+зелёный): buffer[i+0] = 0; // синий buffer[i+1] = 255; // зелёный buffer[i+2] = 255; // красный buffer[i+3] = 0; // прозрачность Вот пример кода, как квадрат нарисовать в консоли, используя framebuffer: How to display something on screen through linux framebuffer?

Ответ 3



Для винды: WriteConsole(). Для DOS - формирование кода вызова INT 21 и через передачу управления на него.

Ответ 4



#include /* для любой linux системы. У меня gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 */ int main() { int i = system ("ls -al"); // показать файлы текущей директории в тч скрытые return 0; }

Ответ 5



Borland C++ 3.1: #include int main() { putch('7'); return 0; }

Комментариев нет:

Отправить комментарий