Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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




Отчет должен содержать: титульный лист; цель работы; условие задачи; текст программы с комментариями; вывод списка до сортировки и после сортировки; выводы по работе.

Вопросы для самоконтроля

1. Линейный односвязный список.

2. Линейный кольцевой список.

3. Особенности сортировки списка.


 

Лабораторная работа № 7. Изучение стандартных функций ввода-вывода в языке Си

Цель и задачи работы, требования к результатам ее выполнения

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

- изучить учебный материал, посвященный вводу- выводу в файлы с помощью библиотеки стандартных функций языка Си [1, 3];

- разработать программу на языке Си для решения заданного варианта задания;

- отладить программу;

- подготовить отчет по лабораторной работе.

Краткая характеристика объекта изучения

Общие сведения о вводе-выводе

В Си отсутствуют встроенные операторы (операции) ввода-вывода. Для ввода-вывода используются стандартные библиотеки функций. Рассмотрим одну из стандартных библиотек ввода- вывода, большинство функций которой описаны в заголовочном файле stdio.h. Иногда функции этой библиотеки называют функциями ввода- вывода «высокого» уровня, так как эти функции не учитывают особенности конкретной архитектуры компьютера и используемой операционной системы. Эти функции присутствуют в эквивалентной форме во всех операционных системах, поддерживающих язык Си.

Рассмотрим некоторые понятия, используемые в этой библиотеке. Основное понятие – поток ввода-вывода.

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

Классификация потоков ввода- вывода:

По направлению:

- входные;

- выходные;

- двунаправленные.

По использованию буфера в оперативной памяти:

- буферизированные;

- небуферизированные.

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

Оперативная память
Программа
Выводимые данные
Буфер вывода
Внешнее устройство вывода
Оперативная память
Программа
Принимающие объекты
Буфер ввода
Внешнее устройство ввода

Рисунок 8 – Схема буферизированного ввода- вывода

Ввод- вывод в файлы

Открытие файла

Прежде, чем работать с файлом на диске или сменном носителе его необходимо открыть. Для этого заранее объявляется указатель на структуру FILE.

Заголовок функции открытия файла:

FILE * fopen(const char *name, const char * mode);

параметры: name – строка, содержащая имя файла, mode – строка, содержащая режим открытия файла, mode может состоять из 2-х частей, 1-ая часть обязательная, возможные значения символы:

«r» – режим «чтение», файл должен существовать;

«w» – режим «запись», если файл существует, то его содержимое стирается; «a» – режим «добавление», если файл не существует, он создается заново, если файл существует, содержимое его не теряется, запись производится всегда в конец файла;

«r+» – режим «чтение + запись», файл должен существовать (как при чтении);

«w+» – режим «запись + чтение», если файл существует, то его содержимое стирается (как при записи);

«a+» – режим «добавление + чтение», как в режиме «добавление» запись всегда производится в конец файла.

Вторая часть необязательная, возможные значения символы:

«t» – файл открывается в текстовом режиме (по умолчанию), при чтении последовательность символов \r\n преобразуется в \n, при записи происходит обратное преобразование, кроме того, символ с кодом 1A интерпретируется как конец файла;

«b» – файл открывается в двоичном режиме, подобные преобразования не проводятся.

Функция возвращает указатель на структуру FILE или NULL в случае ошибки.

Примеры открытия файлов:

FILE *pF;

pF=fopen(“MyFile.txt”, “w”);

Здесь создается файл в текущем каталоге операционной системы с именем MyFile.txt, файл создается для записи в текстовом режиме. Если файл с таким имен уже существовал, то старое его содержимое стирается.

FILE *pF;

pF=fopen(“C:\\Catalog1\\MyFile.dat”, “rb”);

Открывается файл с именем MyFile.dat на диске С: в каталоге Catalog1, файл открывается для чтения в двоичном режиме, файл должен существовать, в противном случае функция возвращает значение NULL. Следует обратить внимание на то, что символ «\» является внутри строки служебным, поэтому, чтобы его включить в строку в качестве обычного символа передним ставится тот же символ «\».

FILE *pF;

pF=fopen(“C:\\Catalog1\\MyFile.txt”, “a+”);

Открывается файл с именем MyFile.txt на диске С: в каталоге Catalog1, файл открывается для добавления и чтения в текстовом режиме, файл может существовать или, если он не существует, то он создается заново.

Следует отметить, что компилятор Microsoft Visual С++ 2013 выдает ошибку при использовании fopen (более ранние компиляторы выдавали предупреждение), сообщается, что функция fopen является небезопасной и устаревшей и предлагается воспользоваться другой функцией fopen_s. Функция имеет заголовок:

errno_t fopen_s(

FILE** pFile,

const char *filename,

const char *mode

);

Основное отличие в том, что указатель на структуру FILE передается в первый параметр функции через указатель. Пример открытия файла для записи:

FILE *pF;

fopen_s(&pF, “MyFile.txt”, “w”);

 

 

Закрытие файла

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

Заголовок функции для закрытия файла:

int fclose(FILE * stream);

параметр stream – указатель на структуру FILE, который связан с открытым файлом, функция возвращает 0, если закрытие реализовано или EOF в случае ошибки.

 

Определение конца файла

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

Функция, которая позволяет проверить достигли ли указатель текущей позиции конца файла, имеет заголовок:

int feof(FILE * stream);

параметр stream – указатель на структуру FILE, который связан с открытым файлом, возвращает не 0, если курсор находится на конце файла или 0, в противном случае.

 

Функции записи в файл

Следующие функции работают так же, как аналогичные функции для записи в поток stdout. Но эти функции имеют на один параметр больше, параметр stream – указатель на структуру FILE, который связан с открытым файлом. Ниже представлены заголовки функций.

Запись символа в файл:

int fputc(int c, FILE *stream);

Запись строки символов в файл:

int fputs(const char * s, FILE * stream);

Запись данных в файл в соответствии с заданным форматом (форматированный вывод):

int fprintf(FILE * stream, const char * format, …);

Рассмотрим еще одну полезную функцию записи, которая применяется, как правило, в двоичном режиме.

Запись данных в файл из оперативной памяти без преобразований:

unsigned fwrite(void * buf, unsigned size, unsigned count, FILE *stream);

параметры: buf – адрес в оперативной памяти, начиная с которого начинают записываться данные, size – размер блока данных в байтах, count – число блоков данных (при записи массива), stream – указатель на структуру FILE; возвращаемое значение – число реально записанных блоков в файл.

 

Функции чтения из файла

Следующие функции работают так же, как аналогичные функции для чтения из потока stdin. Эти функции также имеют на один параметр больше, параметр stream – указатель на структуру FILE, который связан с открытым файлом. Ниже представлены заголовки функций.

Чтение символа из файла:

int fgetc(FILE * stream);

Чтение строки символов из файла:

char * fgets(char * s, int n, FILE * stream);

параметр n – максимальное число читаемых символов.

Считывание данных из файла и запись их в переменные в соответствии с заданным форматом:

int fscanf(FILE * stream, const char * format, …);

Дополнительно рассмотрим функцию чтения, которая работает в двоичном режиме.

Чтение данных из файла и запись их в оперативную память без преобразований:

unsigned fread(void *buf, unsigned size, unsigned count, FILE *stream);

параметры: buf – адрес в оперативной памяти, куда записываются данные, size – размер блока данных в байтах, count – число блоков данных (при чтении массива), stream – указатель на структуру FILE; возвращаемое значение – число реально прочитанных блоков из файла.

 





Поделиться с друзьями:


Дата добавления: 2016-11-18; Мы поможем в написании ваших работ!; просмотров: 398 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Победа - это еще не все, все - это постоянное желание побеждать. © Винс Ломбарди
==> читать все изречения...

2214 - | 2048 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.008 с.