|
Программирование >> Процедурные приложения
ic = getchar(); putchar(ic) ; Эти функции тоже реализованы в виде макросов и в виде функций, а аналогичные им функции, fgetchar() и fputchar(),не имеют макродубликатов. Функции де!сИ( ), getche( ) и ри!сИ( ) Функции getch(), getche() и putch(), объявленные в файле C0NI0.H, не соответствуют стандарту ANSI С, поскольку взаимодействуют напрямую с консолью или портом ввода-вывода. Они не работают с буферами, т.е., например, все символы, вводимые с клавиатуры, немедленно возвращаются функцией getch() в программу. Вывод функции putch() всегда направляется на консоль. Функция getoh() воспринимает нажатия тех клавиш, которые игнорируются функцией getchar(}, например [PageUp], [PageDown], [Home] и [End], и при этом не требует последующего нажатия клавиши [Enter]. Она работает в режиме без эха, а ее аналог getche() - с эхом. В случае функциональных и управляющих клавиш эти функции следует вызывать дважды: сначала возвращается 0, а затем - непосредственно код клавиши. Ввод-вывод строк Для большинства приложений более важным является ввод-вывод целых строк, а не отдельных символов. Ниже мы познакомимся с основными потоковыми функциями, предназначенными для этих целей. Все они объявлены в файле STDIO.H Функции gets( ), puts( ), fgets( ) иfputs( ) Предположим, в компании, торгующей лодками, разрабатывается программа, оперирующая строками, каждая из которых состоит из четырех полей: фамилия торгового представителя, отпускная цена, комиссионные и число проданных лодок. Каждое поле отделено от другого символом пробела. С учетом организации данных в файле лучше всего будет рассматривать каждую запись как отдельную строку. Для решения этой задачи наилучшим образом подходит функция fgets(),которая считывает всю строку сразу. Противоположна ей функция fputs (), осуществляющая вывод строки. Функция fgets () принимает три аргумента: адрес массива, в котором будет сохранена строка, максимальное число символов в строке и указатель потока, из которого выполняется чтение данных. Функция будет считывать символы до тех пор, пока их количество не станет на единицу меньшим, чем указанный предел. Последним всегда записывается символ \0.Если функция fgets() встретит символ новой строки (\n), дальнейшее чтение будет прекращено, а сам символ помещен в массив. Если обнаруживается конец потока, чтение также прекращается. Предположим, у нас есть файл базы данных SALESMAN.DATсо следующими строками: Иванов 32767 0.1530 Сергеев 35000 0.1223 Кузьмин 40000 0.1540 Допустим также, что максимальная длина строки с учетом символа \n не должна превышать 40 символов. Приводимая ниже программа считывает записи из файла и направляет их на стандартное устройство вывода: * fgets. с * Эта программа на языке С демонстрирует процесс считывания строк с * помощью функции fgets() и вывода их с помощью функции fputs() #include <stdio.h> #define INULL CHAR 1 #define IMAX REC SIZE 4 0 void main () FILE *pfinfile; char crecord[IMAX REC SIZE + INULL CHAR]; pfinfile = fopen( salesman.dat , r ) ; while(fgets(crecord, IMAX REC SIZE + INULL CHAR, pfinfile) != NULL) fputs(crecord, stdout); fclose(pfinfile);} Поскольку максимальная длина строки равна 40 символам, следует создать для нее массив, содержащий 41 элемент. Дополнительный элемент необходим для хранения признака конца строки \0. Программа не генерирует самостоятельно никаких разрывов строк при выводе строк на терминал. Тем не менее, структура строк сохраняется такой же, что и в исходном файле, поскольку символы \n читаются и сохраняются в массиве функцией fgets(). Функция fputs() выводит содержимое массива crecord в поток stdout без каких-либо изменений. Функция gets() отличается от функции fgets () тем, что читает данные только из потока stdin, причем до тех пор, пока не будет нажата клавиша [Enter], не проверяя, достаточно ли в указанном массиве места для размещения всех введенных символов. Символ новой строки \n, генерируемый клавишей [Enter], заменяется символом \0. Функция puts() выводит данные в стандартный поток вывода stdout и добавляет в конец выводимой строки символ \n, чего не делает функция fputs(). Пример совместной работы всех перечисленных функций был дан в главе Массивы . Ввод-вывод целых чисел В некоторых приложениях бывает необходимо считывать и записывать потоки (в том числе буферизованные) целых чисел. Для этих целей в языке С существуют две функции: getw() и putw(). Функции getw( ) и putw( ) Дополняющие друг друга функции getw()и putw() очень похожи по своему действию на функции getc( ) и putc( ) за тем исключением, что работают с целыми числами, а не символами, и могут использоваться только с файлами, открытыми в двоичном режиме. Следующая программа открывает двоичный файл, записывает в него ряд целых чисел, закрывает файл, а затем вновь открывает его для чтения данных с одновременным выводом их на экран: * badfile.c * Эта программа на языке С демонстрирует использование функций getw() и * putw( ) для ввода-вывода данных из двоичного файла . #include <stdio.h> #include <stdlib.h> #define ISIZE 10 void main () { FILE *pfi; int ivalue, ivalues [ISIZE], i; pfi = fopen ( integer.dat , wb ) ; if (pfi== NULL) { printf( Heудалось открыть файл. ); exit(l); for(i = 0; i < ISIZE; i++) { ivalues[i] = i + 1; putw(ivalues[i], pfi); } fclose(pfi); pfi = fopen( integer.dat , wb ); if(pfi == NULL) { printf( Heудалось открыть файл. ); exit(l); } while(Ifeof(pfi)) { ivalue = getw(pfi); printf( %3d ,ivalue); } } Посмотрите, какие данные будут выведены на экран при выполнении этой программы, и попытайтесь определить, что было сделано неправильно: 1 2 3 4 5 6 7 8 9 10 -1 Поскольку в цикле while может встретиться признак конца файла EOF, в программе используется функция feof() , сигнализирующая об обнаружении конца файла. Но особенностью этой функции является то, что она не выполняет упреждающего чтения, а лишь проверяет состояние специального флага, который, в свою очередь, устанавливается только после того, как будет непосредственно выполнена операция чтения признака конца файла. Чтобы исправить ошибку, допущенную в предыдущем примере, применим метод упреждающего чтения. * getwputw.c * Это исправленная версия предыдущего примера . #include <stdio.h> #include <stdlib.h> #define ISIZE 10 void main () { FILE *pfi; int ivalue, ivalues [ISIZE], 1; pfi = f open ( integer .dat , wb ); if (pfi == NULL) { printf( Heудалось открыть файл. ); exit(l); } ford = 0; i < ISIZE; { ivalues [i]= i + 1,- putw (ivalues [i], pfi); ) f close (pfi); pfi = fopen ( integer .dat , rb ); if (pfi== NULL) ( printf( Heудалось открыть файл. ); exit(l); } ivalue = getw(pfi); while(Ifeof(pfi)) { printf( %3d ,ivalue) ivalue = getw(pfi); } Прежде чем приступить к выполнению цикла while, программа осуществляет упреждающее чтение файла, для того чтобы проверить, не является ли он пустым. Если файл не пуст, то в переменную ivalue будет записано целочисленное значение. Если же файл окажется пустым, то это будет обнаружено функцией feof( ) . Также обратите внимание, что метод упреждающего чтения потребовал изменения последовательности инструкций в цикле while. Предположим, цикл выполнен уже девять раз. На девятой итерации переменная ivalueприняла значение 9. На следующей итерации на экран будет выведено 9, а переменной будет присвоено значение 10. Цикл выполнится еще раз, в результате чего на экране отобразится 10 и переменная ivalueпримет значение -1, соответствующее константе EOF. Это вызовет завершение цикла while, поскольку функция feof(} определит конец файла. Форматный вывод данных Для вывода форматированных данных, как правило, применяются функции printf() и fprintf(). Первая записывает данные в поток stdout, а вторая - в указанный файл или поток. Как уже говорилось ранее, аргументами функции printf() являются строка форматирования и список выводимых переменных. (В функции fprintf() первый аргумент - указатель файла.) Для каждой
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |