Материал: Методические указания по выполнению лабораторных работ по дисциплине Средства и методы программирования для студентов специальностей. Кащенко Г.А

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

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

Пример:

fprintf (fp, “ %3i %f “, a, c*a);

В файл с указателем fp будет выведено значение целой переменной а, преобразованное в последовательность из трех символов, и значение выражения с*а, преобразованное в последовательность символов вида: знак_числаdddd.dddd. Количество цифр перед точкой зависит от величины выводимого значения, а количество цифр после десятичной точки зависит от точности представления числа.

Количество аргументов и их типы в функциях fscanf и fprintf должны соответствовать последовательности спецификаций преобразования в форматной строке. При несовпадении типов и спецификаций будет введен или выведен «мусор».

Двоичный режим обмена с файлами (двоичный файл). В двоичном режиме в файл можно записать содержимое любой области памяти без преобразования из внутреннего представления. Таким образом, форма представления данных в памяти и в двоичном файле одинакова. Поэтому при чтении из двоичного файла преобразование во внутреннее представление не нужно. Для обмена с двоичным файлом используются функции fread и fwrite.

Прототип функции fread:

int fread (void * buf, int size, int count, FILE *fd);

Функция читает count элементов размерностью size байтов из входного потока fd и помещает их в область памяти, адрес которой находится в переменной buf типа указатель на тип void, т.е. на любой тип. Функция возвращает количество прочитанных элементов, оно может быть меньше count, если конец файла встретился раньше, чем было прочитано count элементов или, если произошла ошибка.

Прототип функции fwrite:

int fwrite (void *buf, int size, int count, FILE *fd);

Функция записывает в выходной поток fd count элементов по size байтов из области памяти, адрес которой находится в buf - переменной - указатель на тип void. Функция возвращает количество выведенных элементов.

Прямой доступ. Кроме последовательного обмена для файлов на диске возможен произвольный (прямой) доступ. Для этого предназначены функции:

  • fseek – устанавливает указатель текущей позиции в потоке на нужный байт;

  • ftell – возвращает значение указателя текущей позиции в потоке;

  • rewind – устанавливает указатель текущей позиции в потоке на начало потока.

Прототип функции fseek:

int fseek ( указатель_на_поток, смещение, начало_отсчета);

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

SEEK_SET – начало файла

SEEK_CUR – текущая позиция

SEEK_END – конец файла.

Пример:

fseek (fp, -(long)sizeof (book), SEEK_CUR);

Указатель текущей позиции будет перемещен на одну структуру типа book назад относительно текущей позиции.

Прототип функции ftell:

long ftell (указатель_на_поток);

Прототип функции rewind:

void rewind (указатель_на_поток);

Пример:

FILE *df;

double x [20], y;

double *p = &x[0];

df = fopen (“b.dat”, “wb+”); //Открыть (создать новый) файл как

//двоичный для записи и чтения

fwrite ((void *) p, sizeof (double), 20, df); //Записать массив х в файл

//начиная с текущей позиции

fseek (df, 80L, SEEK_SET); //Установить указатель текущей

//позиции на 80 байт от начала файла

fread ((void*) &y, sizeof y, 1, df ); //Прочитать 1 элемент размером

//8 байт в переменную y, начиная с текущей позиции,

// т.е. в у будет записано значение х[10]

Стандартные потоки. Любой программе доступны стандартные текстовые потоки:

stdin – доступен для чтения и связи с клавиатурой;

stdout – доступен для записи и связи с дисплеем.

Эти файлы открываются автоматически, когда начинается выполнение программы.

При обращении к функциям чтения/записи указатели на стандартные потоки stdin и stdout опускаются. При вводе с клавиатуры нажатие клавиши enter соответствует признаку конца строки, одновременное нажатие на клавиши ctrl и z- признаку конца файла.

Под выводимые в текстовый файл значения отводится поле, размер которого задается либо по умолчанию (под символ – одна позиция; под строку- число позиций, равное длине строки; под целое число- число позиций, равное числу значащих цифр плюс одна под знак отрицательного числа; под вещественное число – 17 позиций), либо явно – с помощью форматов. (О форматировании выводимых значений см. методические указания к лабораторной работе № 1.) Это необходимо учитывать, чтобы при выводе отдельные элементы не сливались друг с другом. Для разделения значений используются пробелы, разнесение информации по разным строкам и т.д.

Таблица 6.1

Основные функции ввода/вывода для стандартных потоков

Прототипы функций

Действия

int getchar (void)

Осуществляет ввод одного символа, возвращает введенный символ. При достижении конца файла или ошибке ввода возвращает целую константу EOF

int putchar (int c)

Выводит один символ, возвращает только что выведенный символ

int getc (FILE *stream)

Указатель на поток имеет предопределенное значение stdin. Ввод одного символа, возвращает введенный символ. При достижении конца файла или ошибке ввода возвращает EOF. Использует буфер ввода.

int putc ( int c, FILE *stream)

Указатель на поток имеет предопределенное значение stdout. Вывод одного символа, возвращает выведенный символ. Использует буфер вывода.

Продолжение Таблицы 6.1

char * gets ( char * s)

Ввод строки символов, завершенной символом ‘\n’, который появлятся при нажатии на Enter. Возвращает указатель на массив символов, куда производился ввод. Если произошла ошибка, возвращает NULL.

int puts ( char * s)

Вывод строки символов, завершенной символом ‘\0’. Возвращает последний выведенный символ - '\n’, куда производился ввод. Если произошла ошибка, возвращает EOF

int scanf (форматная_строка, список _аргументов)

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

Продолжение Таблицы 6.1

int printf (форматная_строка, список _аргументов)

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

  1. Указания

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

Если в условии задачи не оговорен тип файла, выберите наиболее удобный для решения задачи тип.

Контрольные вопросы

1. Неоднородный тип данных.

2. Операции над структурами и их элементами.

3. Понятие файлового типа.

4. Виды файлов.

5. Способы обращения к элементам файла.

6. Режимы работы с файлами.

7. Форматирование выводимых значений.

8. Основные функции чтения/записи.

Заключение

В учебном пособии по лабораторным работам по дисциплинам "Методы программирования" и "Средства и методы программирования" рассмотрены вопросы, позволяющие студенту более углубленно изучать теоретический материал, предусмотренный учебной программой этой дисциплины и в дальнейшем самостоятельно выполнять лабораторные задания по следующей тематике:

  • Программирование ветвлений. Простые скалярные типы данных;

  • Программирование итерационных циклов. Простые типы данных;

  • Регулярные типы (массивы). Основные алгоритмы обработки массивов;

  • Обработка текстовой информации;

  • Программирование с использованием подпрограмм;

  • Файлы и структуры.

Библиографический список

  1. Подбельский В. В., Фомин С. С. Программирование на языке Си. – М.: Финансы и статистика, 2001.

  2. Подбельский В. В. Язык Си++. – М.: Финансы и статистика, 2001.

  3. Крячков А.В., Сухинина И.В., Томшин В.К. Программирование на С и С++. – М.: Горячая линия-Телеком, 2000.

  4. Абрамов С. А. и др. Задачи по программированию. – М.: Наука, 1988.

  5. Кнут Д. Искусство программирования для ЭВМ. Основные алгоритмы. – М.: Мир, 1976.

  6. Мейер Б., Бодуэн К. Методы программирования: В 2 т. – М.: Мир, 1982.

Содержание

Введение 1

4. Лабораторная работа № 4 4

5. Лабораторная работа № 5 13

6. Лабораторная работа № 6 27

ЗАКЛЮЧЕНИЕ 45

БИБЛИОГРАФИЧЕСКИЙ СПИСОК 47

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

по выполнению лабораторных работ

по дисциплине

"Средства и методы программирования" для студентов специальностей 090105 "Комплексное обеспечение информационной безопасности информационных систем" и 090106 "Информационная безопасность телекоммуникационных систем" очной формы обучения

Часть 2

Составитель

Кащенко Геннадий Алексеевич

В авторской редакции

Компьютерный набор Г.А. Кащенко

Подписано к изданию 20.10.2011.

Уч.-изд. л. 2,9. «С»

ФГБОУВПО «Воронежский государственный технический университет»

394026 Воронеж, Московский просп., 14

Источник: https://studfile.net/preview/16566364/