Стандартный (бесформатный) ввод-вывод. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Стандартный (бесформатный) ввод-вывод.



Самый простой механизм ввода заключается в чтении по одному символу за раз из "стандартного ввода" (обычно с тер-

минала пользователя) с помощью функции getchar. Функция getchar() целого типа при каждом к ней обращении возвращает

следующий вводимый символ. В большинстве систем, которые поддерживают язык Си, терминал может быть заменен некоторым

файлом с помощью обозначения "<". Если некоторая программа prog использует функцию getchar, то командная строка

prog <infile

приведет к тому, что prog будет читать из файла infile, а не с терминала. Переключение ввода делается таким образом, что

сама программа prog не замечает изменения; в частности строка "<infile" не включается в командную строку аргументов

(см. следующую главу). Переключение ввода оказывается незаметным и в том случае, когда вывод поступает из другой прог-

раммы через межпроцессный канал. Например, командная строка

otherprog | prog

прогоняет две программы, otherprog и prog, так, что стандартным вводом для prog служит стандартный вывод other-

prog.

Функция getchar возвращает значение EOF, когда достигается конец файла, какой бы ввод она при этом не считывала.

Стандартная библиотека полагает символическую константу EOF равной -1 (посредством #define в файле stdio.h), но проверки

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

Вывод можно осуществлять с помощью функции putchar(c), помещающей символ 'c' в "стандартный вывод", который по

умолчанию является терминалом. Вывод можно при вызове программы направить в некоторый файл с помощью обозначения ">".

Если prog использует putchar, то командная строка

prog > outfile

приведет к записи стандартного вывода в файл outfile, а не на терминал. В системе ДЕМОС можно также использовать межп-

роцессный канал.

В стандартной библиотеке ввода/вывода "функции" getchar и putchar на самом деле могут быть макросами. Это позволяет

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

 

 

Форматный ввод-вывод.

Две функции: printf для вывода и scanf для ввода (следующий раздел) позволяют преобразовывать численные величины

в символьное представление и обратно. Они также позволяют генерировать и интерпретировать форматные строки. Функция

printf(control, arg1, arg2,...)

преобразует аргументы в текстовую форму в соответствии с форматами, заданными в управляющей строке control, и выдает

результат в стандартный вывод. Управляющая строка содержит два типа объектов: обычные символы, которые просто копиру-

ются в выходной поток, и спецификации преобразований, каждая из которых вызывает преобразование и печать очередного аргу-

мента printf.

Каждая спецификация преобразования начинается с символа "%" и заканчивается символом преобразования (буквой, опреде-

ляющей тип преобразования). Между "%" и символом преобразования могут находиться:

- Знак минус, который вызывает выравнивание преобразованного аргумента по левому краю поля.

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

- Точка, которая отделяет ширину поля от следующей строки цифр.

- Строка цифр (точность); указывает максимальное число символов строки, которые должны быть напечатаны, или число печатаемых справа от десятичной точки цифр для переменных типа float или double.

- Модификатор длины l, который указывает, что соответствующий элемент данных имеет тип long, а не int.

Осуществляющая ввод функция scanf является аналогом printf и позволяет проводить в обратном направлении многие

из тех же самых преобразований. Функция scanf(control, arg1, arg2,...) читает символы из стандартного ввода, интерпретирует их в соответствии с форматом, указанном в аргументе control, и помещает результаты в остальные аргументы. Управляющая строка описывается ниже; другие аргументы, каждый из которых должен быть указателем, определяют, куда следует поместить соответствующим образом преобразованный ввод.

Управляющая строка обычно содержит спецификации преобразования, которые используются для непосредственной интерп-

ретации входных последовательностей. Управляющая строка может содержать:

- пробелы, табуляции или символы новой строки ("символы пустых промежутков"), которые игнорируются;

- обычные символы (не %), которые предполагаются совпадающими со следующими отличными от "символов пустых промежутков" символами входного потока;

- спецификации преобразования, состоящие из символа %, необязательного символа подавления присваивания *, необязательного числа, задающего максимальную ширину поля и символа преобразования.

 

48.Строкой называется последовательность символов,с которой обращаются как с одним элементом.Строка может содержать буквы,цифры,различные спец.символы.В СИ строковые литералы,или строки-константы заключаются в двойные кавычки.

Строка в СИ является массивом символов,который заканчивается нулвым символом (‘\0’).Доступ к строке осуществляется через указатель,ссылающийся на первый символ строки.Значением строки является адрес ее первого символа.Таким образом,в СИ правомерно сказать, что строка-это указатель,фактически указатель на первый символ строки.Строка может быть привоена в обьявлении либо массиву символов, либо переменной типа char*.

Структуры.

В современных языках программирования существует особый тип данных, который мо-

жет включать в себя несколько элементов более простых (причем разных!) типов.

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

разных типов (в том числе и другие структуры).

Одно из применений структур – организация различных баз данных, списков и т.п.

Поскольку структура - это новый тип данных, его надо предварительно объявить в начала

программы.

struct Book {

char author[40]; // автор, символьная строка

char title[80]; // название, символьная строка

int year; // год издания, целое число

int pages; // количество страниц, целое число

};

Для обращения ко всей структуре используется ее имя, а для обращения к отдельному по-

лю имя этого поля ставится через точку. Элементы структуры вводятся последовательно по

одному. Заполнять их можно в любом порядке. С полем структуры можно работать так же, как

и с переменной соответствующего типа: числовые переменные могут участвовать в арифмети-

ческих выражениях, со строками можно выполнять все стандартные операции.

Book b;

strcpy (b.author, " А.С. Пушкин ");

b.year = 1998;

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

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

рительно (выше) надо объявить саму структуру как новый тип данных.

Для обращения к полю структуры также используют точку, но теперь надо указать в квад-

ратных скобках еще номер нужной структуры, например

Book A[20];

...

A[12].pages = 50;

for (i = 0; i < 20; i ++) // цикл по всем структурам в массива

puts(A[i].title); // вывести название книги

Структуры, так же, как и любые другие типы, могут быть параметрами функций и проце-

дур.

Работа с файлами.

Файлы бывают текстовые (в которых можно записывать только буквы, цифры, скобки и

т.п.) и двоичные (в которых могут храниться любые символы из таблицы).

Текстовые файлы

При вводе из текстового файла надо читать последовательно все элементы, обрабатывая

(так же, как и для линейных массивов) ошибки отсутствия или недостатка данных в файле.

Двоичные файлы

С двоичным файлом удобно работать тогда, когда данные записала (или будет читать)

другая программа и их не надо просматривать вручную. Основное преимущество этого способа — скорость чтения и записи, поскольку весь массив читается (или записывается) сразу единым блоком.

Описание функций работы с файломи находятся в библиотеке stdio.h

Сначала надо создать указатель на переменную типа FILE (FILE* file;).

Открытие файла производится вызовом функции fopen (file = fopen(file_name, "w");)

Первый параметр этой функции - имя файла, второй - указывает в каком режиме должен быть открыт файл. "w" - открыть для записи, "r" - открыть для чтения, "a" - дополнение файла(это наиболее используемые режимы, хотя есть и другие). Запись и считывание данных из файла осуществляется следующими функциями: fputc, fputs, fgetc, fgets, fprintf, fscanf(описание этих функций смотрите в stdio.h).

Закрытие файла осуществляется вызовом функции fclose (fclose(file);).



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 413; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.188.252.23 (0.015 с.)