Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебно-практическое пособие ПРОГ.doc
Скачиваний:
38
Добавлен:
20.11.2019
Размер:
5.63 Mб
Скачать

Вопросы для повторения

  1. Понятие константы

  2. Использование директивы препроцессора #define.

  3. Понятие переменной.

  4. Основные типы данных языка Си (int, long, short, unsigned, char, float, double)

  5. Понятие структуры данных.

  6. Механизмы агрегирования ячеек памяти.

  7. Графическое представление структуры данных.

  8. Оператор определения имени типа typedef

  9. Понятие массива.

  10. Понятие указателя.

  11. Связь между массивами и указателями в Си.

  12. Внешние и внутренние переменные.

  13. Функция printf().

  14. Функция scanf().

  15. Оператор присваивания

  16. Арифметические операции

  17. Операции увеличения и уменьшения

  18. Операции сравнения

  19. Логические операции

  20. Побитовые логические операции

  21. Операции сдвига

  22. Операции "увеличить на", "домножить на" и т.п.

  23. Операции с указателями.

  24. Операция приведения типа

  25. Назначение управляющих конструкций

  26. Фигурные скобки

  27. Оператор выбора if и операция условия

  28. Оператор множественного выбора switch

  29. Оператор цикла while

  30. Оператор цикла for

  31. Оператор цикла do...while

  32. Понятие структуры.

  33. Указатели и структуры.

  34. Структуры и оператор определения имени типа typedef

  35. Понятие строки.

  36. Представление строк в языке Си.

  37. Матрицы и многомерные массивы.

  38. Понятие пользовательской функции.

  39. Синтаксис определение пользовательских функций в Си.

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

  41. Аргументы командной строки.

Резюме по теме

В данной теме рассмотрены основы языка Си.

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

Цели и задачи изучения темы

В данной теме рассматриваются основные средства языка Си для работы с файлами.

4.1.Последовательность шагов при работе с файлами

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

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

Работа с файлами складывается из трех шагов.

1. Файл открывается. Это означает, что программа "захватывает" заданный по имени файл, и сообщает операционной системе, что далее она будет с ним работать.

2. Ведется работа с файлом. Из него данные либо считываются, либо в него записываются.

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

4.2.Функция открытия файла fopen

Для доступа к файлу применяется структурный тип данных FILE. Этот тип определен в файле "stdio.h" и может быть системно зависимым, поэтому в целях переносимости программ обращаться явно к полям структуры FILE запрещено. Функция открытия файла fopen возвращает указатель на FILE, который используется далее для работы с открытым файлом. Прототип функции fopen выглядит следующим образом:

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

Здесь path - путь к файлу, mode - режим открытия файла.

Строка mode может содержать несколько букв:

  • "r" (от слова read) означает, что файл открывается для чтения (файл должен существовать).

  • "w" (от слова write) означает запись в файл, при этом старое содержимое файла теряется, а в случае отсутствия файла он создается.

  • "a" (от слова append) означает запись в конец существующего файла или создание нового файла, если файл не существует.

При открытии бинарного файла к строке mode следует добавлять букву "b" (от слова binary), а при открытии текстового файла - букву "t" (от слова text). Кроме того, при открытии можно разрешить выполнять как операции чтения, так и записи; для этого используется символ + (плюс). Порядок букв в строке mode следующий: сначала идет одна из букв "r", "w", "a", затем в произвольном порядке могут идти символы "b", "t", "+".

Открытие файла как текстового указывает, что файл состоит из строк, разделенных определенными символами, которые зависят от операционной системы. Например, в MS DOS и MS Windows это два символа "\r\n". При вводе символы "\r\n" заменяются одним символ "\n". Соответственно, при выводе символ "\n" заменяется на пару "\r\n". В системе Unix строки разделяются одним символом "\n". Таким образом, внутреннее представление текста в Си всегда соответствует системе Unix, а внешнее - реально используемой операционной системе.

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

FILE *f, *g, *h;

. . .

// 1. Открыть текстовый файл "abcd.txt" для чтения

f = fopen("abcd.txt", "rt");

// 2. Открыть бинарный файл "c:\Windows\Temp\tmp.dat" для чтения и записи

// (для разделения директорий используется прямая косая черта / )

g = fopen("c:/Windows/Temp/tmp.dat", "wb+");

// 3. Открыть текстовый файл "c:\Windows\Temp\abcd.log" для дописывания

// в конец файла (для разделения директорий используется обратная косая

// черта повторенная 2 раза \\)

h = fopen("c:\\Windows\\Temp\\abcd.log", "at");

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

Если файл открыт, то fopen возвращает ненулевой указатель на структуру типа FILE. В противном случае возвращается нулевой указатель, при этом глобальная системная переменная errno, описанная в стандартном заголовочном файле "errno.h, содержит численный код ошибки открытия файла. В следующем примере анализируется ошибка открытия файла:

#include <stdio.h>

#include <errno.h>

. . .

FILE *f = fopen("filnam.txt", "rt");

if (f == NULL) {

printf("Ошибка открытия файла с кодом %d\n",errno);

. . .

}

Константа NULL определена в файле "stdio.h". Для расшифровки кода errno можно использовать функцию perror(<строка>), которая печатает переданную строку и системное сообщение о последней ошибке.

Например, предыдущий фрагмент можно переписать следующим образом:

#include <stdio.h>

. . .

FILE *f = fopen("filnam.txt", "rt");

if (f == 0) {

perror("Не могу открыть файл на чтение");

. . .

}

При выполнении данной программы в случае отсутствия файла "filnam.txt" будет напечатано "Не могу открыть файл на чтение: No such file or directory"