Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 11718 Вводвывод в C с использованием файлов 1

Работа добавлена на сайт samzan.net:


- 1 -

Лабораторная работа № 1-17-18

Ввод-вывод в C с использованием файлов

1. Цель работы

Целью работы является разработка, отладка и выполнение программы на C с использованием операций ввода-вывода в файлы.

2. Состав рабочего места

2.1. Оборудование: IBM-совместимый персональный компьютер (ПК).

2.2. Программное обеспечение: операционная система Windows, интегрированная оболочка Dev C++.

3. Краткие теоретические сведения

3.1. Ввод и вывод в C

Язык C рассматривает файл как последовательность байтов, каждый из которых может быть прочитан индивидуально. Это отвечает структуре файла в среде Unix, откуда происходит язык C.

Функции ввода и вывода в стандартной библиотеке C  позволяют читать данные из файлов или получать их с устройств ввода и записывать данные в файлы или выводить их на различные устройства.

В C имеются два класса функций ввода-вывода: функции ввода-вывода верхнего уровня и функции ввода-вывода нижнего уровня.

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

Для пользователя файл, открытый на верхнем уровне, представляется как последовательность  считываемых или записываемых байтов. Эта последовательность считываемых или записываемых байтов называют потоком (stream).

Когда поток открывается для ввода-вывода, он связывается со структурой типа FILE (имя типа FILE определяется с помощью оператора typedef в разделе stdio.h стандартной библиотеки C) с помощью указателя. Этот указатель  используется для всех операций с данным файлом (открытия, чтения, записи и закрытия).

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

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

Все функции ввода-вывода верхнего уровня описаны в разделе stdio.h.

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

При работе с файлом на нижнем уровне с ним связывается дескриптор (handle). Дескриптор является целым значением, характеризующим размещение информации об открытом файле во внутренних таблицах системы.

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

Функции ввода-вывода нижнего уровня переносимы в рамках некоторых систем программирования C, в частности относящихся к операционной системе Unix.

Описания функций нижнего уровня содержатся в разделе io.h стандартной библиотеки C.

Стандарт ANSI C поддерживает только стандартный пакет ввода/вывода, так как нет возможности представления всех операционных систем одной моделью низкоуровневого ввода/вывода.

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

3.2. Открытие файлов

Когда программа начинает выполняться, автоматически открываются следующие пять потоков:

  1. стандартный ввод (stdin);
  2. стандартный вывод (stdout);
  3. стандартный вывод для сообщений об ошибках (stderr);
  4. стандартный последовательный порт (stdaux);
  5. стандартное устройство печати (stdprn).

Рассмотренные ранее функции scanf(), getchar() и gets() работают с stdin, а printf(), putchar() и puts() – с stdout.

По умолчанию stdin связывается с клавиатурой, а stdout и stderr – с  дисплеем, однако для переопределения стандартного ввода-вывода программы можно использовать символы перенаправления из командного языка MS DOS или рассматриваемую ниже функцию freopen().

Следует отметить, что имена stdin, stdout и stderr в C также являются  указателями на переменные типа FILE и их можно использовать как идентификаторы файла в приведенных ниже функциях ввода-вывода. Кроме того, в stdio.h определена константа EOF, численное значение которой равно -1. Эта константа возвращается некоторыми функциями ввода, когда достигается конец файла.  

Остальные файлы программы должны быть открыты для ввода и вывода. Открытие файлов выполняется с помощью функции fopen(). Закрытие уже открытого файла и переназначение потока на другой файл осуществляется с помощью функции freopen(). Функции fopen() и freopen() имеют следующие описания:

FILE *fopen(char *имя-файла, char * тип)

FILE *freopen(char * имя-файла, char * тип,

FILE *имя-старого-файла)

где

имя-файла – строковая  константа или переменная, задающая имя файла (с указанием пути, если это необходимо).

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

Значение

типа

Действие

"r"

Открыть текстовый файл для чтения (файл должен существовать).

"w"

Открыть пустой текстовый файл для записи; если файл существует, его содержимое теряется.

"a"

Открыть текстовый файл для записи в конец файла (добавление); файл создается, если он не существует.

"r+"

Открыть для чтения и записи (файл должен существовать).

"w+"

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

"a+"

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

"rb", "wb", "ab", "ab+", "a+b", "wb+", "w+b"

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

 

имя-старого-файла –  указатель    на закрываемый файл, поток с которого переназначается на файл, определенный в имени-файла.

После того как программа успешно откроет файл, функции fopen() и freopen() возвращают идентификатор файла – указатель  на переменную типа FILE, который могут использовать другие функции ввода/вывода, чтобы ссылаться на этот файл. В случае, если произошла ошибка при открытии или переназначении файла, функции возвращают значение NULL.

3.3. Ввод/вывод форматированных данных в файлы и строки

Помимо рассмотренных ранее функций в разделе stdio.h стандартной библиотеке C реализованы также следующие функции ввода и вывода форматированных данных:

  1. fprintf() – форматированная  запись данных в файл;
  2. sprintf() – форматированная  запись данных в строку;
  3. fscanf() – форматированное  чтение данных из файла;
  4. sscanf() – форматированное  чтение данных из строки;

Функции форматированного ввода и вывода fprintf(), sprintf(), fscanf() и sscanf() определяются следующим образом:

int fprintf(FILE * идентификатор-файла, 

char *строка-формата[, аргумент-1,...])

int sprintf(char * строка, char *строка-формата[,аргумент-1,...])

int fscanf (FILE * идентификатор-файла,

char * строка-формата[, аргумент-1,...])

int sscanf(char * строка, char * строка-формата[,аргумент-1,...])

где

*идентификатор-файла – указатель  на файл (переменную типа FILE),  в который записываются или из которого считываются данные.

* строка – строка, в которую записываются или из которой считываются данные.

строка-формата – строка  формата (для fprintf() и sprintf() определяется аналогично printf(), а для fscanf() и sscanf() – аналогично scanf()).

аргумент-1,... – выводимые  выражения (для fprintf() и sprintf()) или адреса вводимых переменных (для fscanf() и sscanf()).

Возвращаемое значение: для fprintf() и sprintf() – количество  выведенных символов, а для fscanf() и sscanf() – количество  успешно введенных, преобразованных и присвоенных элементов ввода или EOF – по достижении конца файла или конца строки.

Функции sscanf() и sprintf() выполняют те же действия, что и функции fscanf() и fprintf(), но вводимые данные берутся из строки, а выводимые данные помещаются в строку.

3.4. Функция закрытия файлов

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

Функция fclose() закрывает указанный файл. Все буфера, связанные с потоками (как системные, так и пользовательские) при закрытии файла автоматически освобождаются. Функция имеет следующее определение:

int fclose (FILE * идентификатор-файла)

где

идентификатор-файла – указатель  на закрываемый  файл (переменную типа FILE).   

Возвращаемое значение: функция fclose() возвращает значение 0, если файл успешно закрыт или значение EOF, если произошла ошибка.

3.5. Файловый ввод/вывод символов и строк

Помимо рассмотренных ранее функций вывода символов и строк в стандартный поток stdout, в разделе stdio.h стандартной библиотеки C реализованы также следующие функции вывода символов и строк в файлы:

  1. fputc() – запись  символа в файл;
  2. putc() – запись  символа в файл (версия макро);
  3. fputs() – запись строки в файл;
  4. ungetc() – возврат  символа в файл.

Для ввода символов и строк из файла можно использовать следующие функции:

  1. fgetc() – чтение  символа из файла;
  2. getc() – чтение  символа из файла (версия макро);
  3. fgets() – чтение строки из файла;

Функции fputc(), putc(), ungetc(), fgetc() и getc() записывают символ в файл или читают символ из файла и определяются следующим образом:

int fputc (int символ, FILE * идентификатор-файла)

 int putc (int символ, FILE * идентификатор-файла)

int ungetc (int символ, FILE * идентификатор-файла)

int fgetc (FILE * идентификатор-файла)

int getc (FILE * идентификатор-файла)

где

символ – символ, записываемый в выводной поток.

* идентификатор-файла – указатель  на файл (переменную типа FILE),  в который записывается или из которого считывается символ.

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

Функции getc() и fgetc(), работают почти так же, как функция getchar(), а функции  putc() и fputc() – почти так же, как функция putchar(). Разница состоит в том, что этим функциям необходимо указать, какой файл использовать.  

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

Функции fputs()  и fgets() записывают строку в файл или читают строку из файла и определяются следующим образом:

int fputs (const char *строка, FILE * идентификатор-файла)

char *fgetc (char * строка, int максимальная-длина,

FILE * идентификатор-файла)

где

* строка – указатель на вводимую или выводимую строку.

максимальная-длина – максимальная длина вводимой строки.

* идентификатор-файла – указатель на файл (переменную типа FILE),  в который записывается или из которого считывается строка.

Функция fgets() читает информацию ввода до первого символа перевода строки или пока прочитано меньше символов, чем задано в максимальной-длине минус один символ или же пока не достигнут конец файла; затем функция fgets() добавляет конечный символ "\0", чтобы сформировать строку. Если fgets() читает целую строку до того, как достигнута максимальная-длина, она добавляет символ перевода строки в конце строки, как раз перед нулевым символом. В этом она отличается от gets(), которая читает символ перевода строки, но опускает его.

Функция fgets() возвращает значение NULL в случае, если она читает символ конца файла. Это можно использовать, чтобы проверить, достигнут ли конец файла. Иначе она возвращает переданный ей адрес.

Функция fputs() имеет два аргумента: сначала адрес строки, затем файловый указатель. Она записывает строку, найденную по указателю, в файл. В отличие от puts(), функция fputs() не добавляет символ новой строки при выводе. Так же, как и функция puts(), функция fputs() при успешном выводе возвращает неотрицательное число, а при ошибке возвращает значение EOF.

4. Порядок выполнения работы

Порядок выполнения работы:

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

№ варианта

Операции, выполняемые в программе

Содержимое строки вводимого файла/файлов

Содержимое строки выводимого файла/файлов

1.

Создать из двух исходных файлов, выводной   файл, содержащий оба вида данных.

Файл 1. Фамилия

Файл 2. Год рождения  

Фамилия и год рождения.

2.

Добавить данные в конец исходного файла. Добавляемые данные вводятся с клавиатуры. Признаком окончания ввода является символ "0".

Номер телефона

Номер телефона

3.

Разбить данные из исходного файла в два выводных файла.

Фамилия и год рождения

Файл 1. Фамилия

Файл 2. Год рождения

4.

Добавить данные из одного файла в конец другого файла.

Файл 1. Фамилия и

год рождения

Файл 2. Фамилия и год рождения

Фамилия и год рождения

5.

Данные из исходного файла  отсортировать по первым буквам и записать в выводной файл.

Фамилия

Фамилия

6.

В исходный файл, содержащий отсортированные данные, добавить новые данные, введенные с клавиатуры (введенные данные должны быть размещены в порядке возрастания первой буквы) и поместить данные в выводной файл. Признаком окончания ввода служит символ "0".

Фамилия

Фамилия

7.

Удалить строки из исходного файла и поместить полученные данные в выводной файл. Фамилии для удаляемых строк вводятся с клавиатуры. Признаком окончания ввода служит символ "0";

Фамилия и зарплата

Фамилия и зарплата

8.

Изменить строки  в исходном файле и поместить данные в выводной файл. Фамилии для изменяемых строк вводятся с клавиатуры. Если строка найдена, выдается запрос на новое значение зарплаты. Признаком окончания ввода служит символ "*".

Фамилия и зарплата

Фамилия и зарплата

9.

Удалить строки  исходного файла и поместить данные в выводной файл. Данные для удаления содержаться в файле.

Файл 1. Фамилия и зарплата

Файл 2. Удаляемая фамилия

Фамилия и зарплата

10.

Слить  данные двух  исходных файлов и поместить данные в выводной файл. Данные для изменения содержаться в файле.

Файл 1. Фамилия и зарплата

Файл 2. Фамилия и зарплата

Фамилия и зарплата

11.

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

Файл 1. Фамилия  

Файл 2. Фамилия  

Фамилия

12.

Найти данные в исходном файле. Фамилии для поиска  вводятся с клавиатуры.  Признаком окончания ввода служит символ "*".

Фамилия и зарплата

----

13.

Найти данные в исходном файле. Данные для поиска (фамилии) содержатся в файле поиска.

Файл 1. Фамилия и зарплата

Файл 2. Фамилия  

----

14.

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

Фамилия и зарплата

-----

15.

Найти данные, соответствующие заданному критерию, в исходном файле. Критерием поиска служит первая буква фамилии,  вводимая с клавиатуры.

Фамилия и зарплата

-----

16.

Найти данные, соответствующие заданному критерию, в исходном файле. Критерием поиска является превышение заданного возраста. Текущий год и возраст вводятся с   клавиатуры (месяц рождения не учитывается).

Фамилия и год рождения

-----

17.

Найти данные, соответствующие заданному критерию, в исходном файле. Критерием поиска является наличие телефона.

Фамилия и номер телефона или “-“, если нет телефона

-----

18.

Сформировать новый файл из исходных файлов.

Файл 1. Фамилия и год рождения

Файл 2. Фамилия и зарплата

Фамилия, год рождения и зарплата

19.

Модифицировать строки исходного файла и разместить полученные данные в выводном файле. С клавиатуры вводится текущий  год (месяц рождения не учитывается);

Фамилия и возраст

Фамилия и год рождения

20.

Модифицировать строки исходного файла и разместить полученные данные в выводном файле. С клавиатуры вводится год рождения для каждой фамилии.

Фамилия и зарплата

Фамилия, год рождения и зарплата.

21.

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

фамилия, год рождения и зарплата

Фамилия, стаж работы и зарплата

22.

Поиск слов в словаре. С клавиатуры вводится английское слово. Признаком окончания ввода является символ "*".

английское слово и соответствующее ему русское слово

-----

23.

Проверить файл на наличие заданной последовательности символов. С клавиатуры вводятся искомые последовательности символов. Признаком окончания ввода является символ "*".

произвольный текст

----

24.

Удалить  заданные последовательности символов из файла и разместить полученные данные в выводном файле. С клавиатуры вводятся искомые последовательности символов. Признаком окончания ввода является символ "*".

Произвольный текст

Измененный текст

25.

Заменить  заданные последовательности символов в файле и разместить полученные данные в выводном файле. С клавиатуры вводятся искомые последовательности символов и последовательности замены. Признаком окончания ввода является символ "*".

Произвольный текст

Измененный текст

26.

Модифицировать строки исходного файла и разместить полученные данные в выводном файле. Ввести табельный номер (1<= номер <=число-строк) в соответствии с датой поступления на работу (чем раньше поступил, тем меньше номер). Если даты совпадают - больший номер у того, кто стоит в списке позже.

Фамилия и дата

поступления на работу - в виде ДД.ММ.ГГ, где ДД, ММ и ГГ -две цифры, обозначающие соответственно день, номер месяца и год

табельный номер, фамилия и дата поступления

27.

Найти данные, соответствующие заданному критерию, в исходном файле. Критерием поиска является превышение заданного возраста. Текущая дата и возраст вводятся с   клавиатуры

фамилия и дата рождения - в виде ДД.ММ.ГГ, где ДД, ММ и ГГ -две цифры, обозначающие соответственно день, номер месяца и год

----

28.

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

Фамилия и зарплата

Фамилия (с инициалами) и зарплата

29.

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

Слова, разделенные одним из следующих символов-разделителей:

" .,:; ".  

----

30.

Определить количество   одинаковых слов, содержащихся в  строках исходного   файла и вывести результат на дисплей

(максимальное число слов  в файле – 50).

Слова, разделенные одним из следующих символов-разделителей:

" .,:; ".  

----

31.

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

Количество слов в строках файла должно быть одинаковым;

В качестве символа-разделителя между словами использовать  символ ":".

----

32.

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

Слова, разделенные одним из следующих символов-разделителей:

" .,:; ".  

Преобразованный файл

33.

Найти заданные слова и частоту их повторения в строках исходного   файла и вывести результат на дисплей

(максимальное число слов  в файле – 50).

Слова, разделенные одним из следующих символов-разделителей:

" .,:; ".  

----

34.

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

Предложения, разделенные одним из следующих символов-разделителей:

".?!".  

Преобразованный файл

35.

Вывести список слов – правильных идентификаторов языка C среди слов, содержащихся в строках файла.

Слова, разделенные одним из следующих символов-разделителей:

" .,:; ".  

----

 

  1. Введите программу с клавиатуры в среде BorlandC++.
  2. Выполните отладку программы и запустите ее на выполнение. Протестируйте программу для ошибочных и правильных значений исходных данных.
  3. Покажите преподавателю программу и результаты ее работы (при ошибочных и правильных значениях исходных данных) и скопируйте текст программы и результаты работы программы в окно текстового редактора Блокнот с заголовками "Текст программы имя-программы" и "Результат работы программы имя-программы".
  4. Скопируйте полученный в окне текстового редактора Блокнот документ на свою дискету или флэш-карту.

5. Содержание отчета

В отчете должно быть представлено содержимое созданного вами документа.

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

  1. Каковы отличия функций ввода-вывода верхнего уровня от функций ввода-вывода нижнего уровня?
  2. Как определяются файлы в языке C?
  3. Какие файлы автоматически открываются в начале выполнения программы?
  4. Для каких целей используются функции открытия файлов?
  5. Какие режимы можно задать при открытии файла в C?
  6. Какие функции  выполняют форматированную запись в файл  и форматированное чтение из файла?
  7. Каковы различия между функциями printf(), fprintf() и sprintf()?
  8. Для каких целей используются функции закрытия файлов?
  9. Какие функции используются для ввода-вывода символов и строк в файлы?
  10. Чем отличается реализация функций fputc() и fgets() от реализации функций puts() и gets()?

 




1. Уроки чтения на русском языке в азербайджанской школе
2. Методы измерения ионных токов
3. Введение Заработная плата является очень важным вопросом для каждого предприятия так как от её размера пр
4. тематический анализ
5. . Введение 2. Состав сточных вод и основные методы их очистки 3
6. Лабораторная работа 3403 взаимодействие рентгеновского излучения с веществом
7. лекциях ~ прагматично и не несет непосредственно в себе ценности действует по формуле ldquo;если
8. Тема- Определение финансовых результатов деятельности дистанции электроснабжения Цель- Познакомиться с ф
9. Реферат- Проектирование специализированного процессора
10. Заслон пожароопасной продукции
11. вариантов для выбора трансформаторов оптимальность которых выясняется на основе техникоэкономического об
12. Влияние тренировочной деятельности на развитие репродуктивной системы юных спортсмено
13. MY SONG2013 номинация эстрадный вокал солисты и ансамбли
14. экономические последствия Безработица и занятость молодежи ~ основные проблемы стабилизации ры
15. перекрывает ему кислород
16. Социология науки
17. способ повествования ориентированный на воспроизведение живой устной речи
18. АФГАНИСТАН ОСТАНЕТСЯ В МОЕЙ ПАМЯТИ НАВСЕГДА
19. Эмоциональный интеллект
20.  Red the sentences nd complete chrcter djectives with the vowels