- •Часть 1
- •Общие сведения Сведения об эумк
- •Методические рекомендации по изучению дисциплины
- •Рабочая учебная программа
- •Часть 2 184
- •Пояснительная записка
- •Содержание дисциплины
- •Индивидуальные практические работы, их характеристика
- •Контрольные работы, их характеристика
- •Литература
- •Основная
- •Дополнительная
- •Перечень компьютерных программ, наглядных и других пособий, методических указаний и материалов и технических средств обучения
- •Учебно-методические пособия
- •Алфавит языка
- •Лексемы
- •Идентификаторы
- •Ключевые слова
- •Знаки операций
- •Константы
- •Комментарии
- •Тема 2. Типы данных Концепция типа данных.
- •Простые типы данных
- •Целый тип int
- •Символьный тип char
- •Типы с плавающей точкой: float, double, long double
- •Тема 3. Выражения
- •Переменные
- •Именованные константы
- •Операции
- •Операции присваивания
- •Инкремент и декремент
- •Унарный плюс и унарный минус (строка 2)
- •Явное преобразование типа
- •Операция определения размера sizeof
- •Деление и остаток от деления
- •Логические операции не, и, или (!, &&, ||)
- •Условная операция (?:)
- •Операция запятая (,)
- •Операции взятия адреса и разадресации
- •Тема 4. Операторы
- •Структура программы
- •Тема 5. Базовые конструкции структурного программирования
- •Операторы ветвления
- •1. Условный оператор if
- •2. Оператор switch
- •Операторы цикла
- •1. Цикл с предусловием while
- •2. Цикл с постусловием do-while
- •3. Цикл с параметром for
- •Тема 6. Массивы
- •Тема 7. Указатели и массивы
- •Тема 8. Строки символов
- •Тема 9. Структуры
- •Массивы структур
- •Битовые поля
- •Объединения
- •Перечисления
- •Тема 10. Функции
- •Глобальные, локальные и статические переменные
- •Параметры функции
- •Передача массивов в качестве параметров функции
- •Функция main, ее параметры
- •Функции стандартной библиотеки
- •Функции форматного вывода и ввода printf и scanf
- •Тема 11. Файлы
- •Тема 12. Работа с динамической памятью
- •Тема 13. Динамические структуры данных
- •Очереди
- •Линейные списки
- •Бинарные деревья
- •Практический раздел Общие указания Указания по выбору варианта
- •Порядок оформление итогового отчета
- •Индивидуальные практические работы Индивидуальная практическая работа 1 Методические указания
- •Варианты заданий.
- •Индивидуальная практическая работа 2 Методические указания
- •Варианты заданий
- •Контрольные работы Контрольная работа 1 Методические указания
- •Варианты заданий
- •Контрольная работа 2 Методические указания
- •Варианты заданий
Тема 11. Файлы
Для работы с файлом нужно сначала объявить указатель файла, который будет в дальнейшем использоваться для непосредственной работы с файлом:
FILE *fp;
где FILE - имя типа по аналогии с char, int, float, double; fp - переменная-указатель на файл.
Далее нужно открыть файл, т.е. связать указатель файла с конкретным файлом, который или уже существует или будет создаваться. Для этого используется функция fopen(<имя файла>, <режим>), например:
fp = fopen("myFile1", "w");
Здесь "myFile1" - имя файла, "w" - режим использования файла. Возможны следующие режимы:
"r" - чтение существующего файла;
"w" - запись в файл (если он существует, то его содержимое уничтожается; если файл
отсутствует, то он будет создан;
"a" - добавление в конец файла (если файл отсутствует, то он будет создан).
Чтобы выполнялись и чтение и запись нужно в стринг режима добавить знак "+". Для бинарных (двоичных) файлов в стринг режима нужно добавить букву "b", а для текстовых файлов - букву "t" (последнее подразумевается по умолчанию).
Теперь можно работать с файлом с помощью библиотечных функций fscanf и fprintf. Эти функции аналогичны функциям scanf и printf и отличаются тем, что ввод/вывод данных, связанный с консолью, теперь перенаправляется в файл, для чего в эти функции добавлен еще один аргумент - указатель файла.
После окончания работы с файлом, он должен быть закрыт. Делается это с помощью библиотечной функции fclose, при этом связь файла с указателем файла разрывается.
Пример 1. Запишем в файл myFile1 данные, а затем выполним чтение этих данных из файла:
int n1 = 123, n2 = 6789, n3, n4;
char m1[] = "Character_data", m2[50];
fprintf(fp, "%d %d %s", n1, n2, m1); //запись данных в файл из n1, n2 и массива m1
fclose(fp); //закрытие файла
fp = fopen("myFile1", "r"); //открытие файла на чтение
fscanf(fp, "%d%d%s", &n3, &n4, m2); //чтение данных из файла в n3, n4 и массив m2
fclose(fp); //закрытие файла
puts("------ Numbers and string: ------");
printf("%d %d %s", n3, n4, m2); //вывод данных на экран из n3, n4 и массива m2
puts(""); //переход к новой строке
Все то же самое можно выполнить, открывая файл один раз и используя функцию rewind для перемещения указателя файла к началу файла:
fp = fopen("myFile1", "w+"); //открытие файла на запись и чтение
fprintf(fp, "%d %d %s", n1, n2, m1); //запись данных в файл
rewind(fp); //переход к началу файла
fscanf(fp, "%d%d%s", &n3, &n4, m2); //чтение данных из файла
fclose(fp); //закрытие файла
printf("%d %d %s\n", n3, n4, m2); //вывод данных на экран
Пример 2. Запишем в файл, а затем прочитаем из него структуру данных:
struct student {
char familia[50];
int N_zachetki, god_rogdenia;
} stu = {"Ivanov_Ivan_Ivanovich", 572203, 1987};
fp = fopen("myFile2", "w+"); //открытие файла на запись и чтение
fprintf(fp, "%s %d %d", stu.familia, stu.N_zachetki, stu.god_rogdenia); //запись данных
//в файл
rewind(fp); //переход к началу файла
fscanf(fp, "%s%d%d", m2, &n3, &n4); //чтение данных из файла
fclose(fp); //закрытие файла
puts("------ Struktura: ---------------");
printf("%s %d %d\n", m2, n3, n4); //вывод данных на экран
Пример 3. Запишем в файл и прочитаем из него массив данных:
int mas1[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int mas2[10];
fp = fopen("myFile3", "w+"); //открытие файла на запись и чтение
for (int i=0; i<10; ++i)
fprintf(fp, "%d ", mas1[i]);
rewind(fp); //переход к началу файла
for (i=0; i<10; ++i)
fscanf(fp, "%d", &mas2[i]);
fclose(fp);
puts("------ Massiv: ------------------");
for (i=0; i<10; ++i)
printf("%d ", mas2[i]);
Замечание 1. Если при чтении достигнут конец файла, то следующая функция чтения fscanf возвращает константу EOF (End Of File). Поэтому, если неизвестно, сколько данных содержится в файле, то можно организовать чтение в цикле и выйти из него по условию, например, так:
while (1)
{
. . .
if (fscanf(fp, "%d ", &n) == EOF)
break; //выход из цикла
. . .
}
Замечание 2. Для работы с символьной информацией можно также использовать функции fgets и fputs, которые похожи на функции gets и puts, но отличаются тем, что в них добавлен еще один аргумент - указатель файла, а в функцию fgets - еще и агрумент, задающий число считываемых символов (может быть считано меньше символов, если встретится символ перевода строки или символ конца файла).
Рассмотренный выше пример с двумя числами n1 и n2 и стрингом m1 можно записать с использованием функций fgets и fputs следующим образом:
fp = fopen("myFile4", "w+"); //открытие файла на запись и чтение
fprintf(fp, "%d %d ", n1, n2); //запись чисел n1 и n2 в файл
fputs(m1, fp); //запись стринга m1 в файл
rewind(fp); //переход к началу файла
fscanf(fp, "%d%d ", &n3, &n4); //чтение чисел из файла в n3 и n4
fgets(m2, 15, fp); //чтение стринга из файла в m2
fclose(fp); //закрытие файла
puts("------ Numbers and string: ------");
printf("%d %d %s\n", n3, n4, m2); //вывод данных на экран