Лабораторная работа: Организация ввода-вывода
В этом случае все, что шло в поток stdout, пойдет в файл ex.txt.
Например,
#include <stdio.h>
#include <conio.h>
#include <mem.h>
void main()
{
clrscr();
FILE *fp = fopen("exl.txt", "w+");
if(fp = NULL)
{
рerrоr("Ошибка при открытии файла"); // вывод в stderr return;
};
FILE *pbuf=stdin; int с = getc(stdin);
fclose(fp);
}
Функция fgetc и макрокоманда getc
Прототипы:
int fgetc(FILE *stream);
int getc(FILE *stream);
Возвращает: символ, расширенный до int без продолжения знака. В случае ошибки или конца файла возвращает EOF ( = -1 = 0xFFFF).
Описание. Считывает очередной символ из входного потока и увеличивает указатель текущего положения (СР - current position) на 1. При вводе с клавиатуры (stream=stdin) выполняется после нажатия клавиши Enter. Макрокоманда getc полностью аналогична функции fgetc. В файле stdio.h определена, как
#define getc(f) ((--((f)->level) >= 0) ? (unsigned char)(*(f)-->curp++) \ :_fgetc (f))
Разберите синтаксис этого макроса !
Хотя getc и fgetc аналогичны, но лучше пользоваться макросом по следующей причине. Чтение из файла происходит блоками по 256b, 512b и т.д. После обработки одного блока в ОЗУ с диска считывается следующий блок. Макрос работает с текущим блоком напрямую, как видно из определения, и обращается к функции fgetc только после обработки этого блока. Функция fgetc также работает с блоком в ОЗУ, но каждое обращение к нему реализуется через вызов функции. Таким образом, использование getc увеличивает скорость за счет увеличения кода. Использование fgetc уменьшает код ценой уменьшения скорости.
Функция fgetchar и макрокоманда getchar
Прототипы: int fgetchar(void);
int getchar(void);
Возвращает : символ, расширенный до int без продолжения знака. В случае ошибки или конца файла возвращает EOF. Описание. Считывает очередной символ из стандартного входного потока и увеличивает СР на 1. Поток stdin, как и любой открытый файл, имеет буфер с размером по умолчанию 512b. Функция выполняется после нажатия клавиши Enter, после чего вводит 1 символ. Остальные введенные символы остаются в буфере, ожидая своей участи. Макрос getchar аналогичен функции fgetchar.
Функции getch и getche
Прототипы: int getch(void);
int getche(void);