- •5.091405 «Обслуговування комп’ютеризованих інтегрованих та робототехнічних систем»
- •Виды алгоритмов
- •Структура програми. Алфавіт. Типи даних та операції
- •Структура программы
- •Алфавит языка
- •Знаки операций
- •Комментарии
- •Типы данных и операции
- •Описание меток
- •Описание переменных
- •Var имя переменной : тип;
- •Описание типов
- •Арифметические выражения
- •Логические выражения
- •Основные операторы
- •Операторы ввода и вывода
- •Ввод с консоли
- •Вывод на консоль
- •Форматный вывод
- •Условные операторы Условный оператор if
- •Оператор выбора case
- •Циклічні розрахункові процеси
- •Оператор цикла с параметром
- •Оператор цикла с условием
- •Регулярний тип (масив)
- •Сортировка массивов
- •Улучшенные сортировки
- •Сортировка Шелла
- •Символьный тип данных
- •Тип динамічні рядки (string)
- •Типи даних, що визначаються користувачем
- •Var Имя множества:Set of базовый тип;
- •Var Имя множества:Имя типа;
- •1. Var Имя записи:record
- •Var Имя записи:Имя типа для записи;
- •Складні програми. Робота з файлами Робота з процедурами та функціями
- •Види файлів. Робота з файлами
- •Когда нужно использовать файлы
- •Разновидности файлов
- •Открытие файла
- •Закрытие файла
- •Считывание из файла
- •Запись в файл
- •Модульна структура програми. Створення інтерфейсу користувача
- •Стандартные модули языка Pascal
- •Подключение модулей
- •Секция реализации
- •Секция инициализации
- •Взаимодействие модулей
- •Компиляция модулей
- •Пример модуля
- •Передача аргументов из командной строки
- •Створення інтерфейсу користувача Текстовый режим
- •Позиционирование
- •Ожидание
- •Пример использования текстовой графики
- •Решение
- •Создание дружественного интерфейса
- •Заставка
- •Ввод информации
- •Приглашения
- •Мова Сі Основні поняття та складові частини мови Сі
- •Структура програми на мові Сі. Елементи мови Сі
- •Типи даних та їх об"явлення. Базові типи даних.
- •1.2.1 Категории типов данных
- •Типи даних, що визначаються користувачем.
- •Вирази та присвоювання
- •Програмування на мові Сі
- •Види операторів. Умовні оператори
- •Оператори циклів
- •Оператори передачі керування
- •Процедури та функції
- •Виклик функцій зі змінною кількістю параметрів. Параметри функції main
- •Структура програми та класи пам"яті. Область життя та область видимості
- •Покажчики та операції над покажчиками
- •Масиви. Робота з масивами
- •Динамічний розподіл пам"яті. Динамічне розміщення масивів
- •Директиви препроцесора
- •Лінійні списки. Робота зі списками
- •Стеки та черги
- •Сортування та злиття списків
- •Пошук в лінійних списках
- •Технологія створення програм
- •Робота з файлами та потоками
- •Открытие файла: функция fopen
- •Константа null
- •Диагностика ошибок: функция perror
- •Функции бинарного чтения и записи fread и fwrite
- •Закрытие файла: функция fclose
- •Пример: подсчет числа символов и строк в текстовом файле
- •Форматный ввод-вывод: функции fscanf и fprintf
- •Понятие потока ввода или вывода
- •Функции scanf и printf ввода и вывода в стандартные потоки
- •Функции текстового преобразования sscanf и sprintf
- •Другие полезные функции ввода-вывода
- •Робота з рядками
- •Определение типов символов
- •Пример: программа "Записная книжка"
- •Аргументы командной строки
Другие полезные функции ввода-вывода
Стандартная библиотека ввода-вывода Си содержит ряд других полезных функций ввода-вывода. Отметим некоторые из них.
|
Посимвольный ввод-вывод |
|
||
|
int fgetc(FILE *f); |
ввести символ из потока f |
|
|
|
int fputc(int c, FILE *f); |
вывести символ в поток f |
|
|
|
Построковый ввод-вывод |
|||
|
char *fgets(char *line,int size, FILE *f); |
ввести строку из потока f |
||
|
char *fputs(char *line, FILE *f); |
вывести строку в поток f |
||
|
Позиционирование в файле |
|
|
int fseek(FILE *f, long offset, int whence); |
установить текущую позицию в файле f |
|
long ftell(FILE *f); |
получить текущую позицию в файле f |
|
int feof(FILE *f); |
проверить,достигнут ли конец файла f |
Функция fgetc возвращает код введенного символа или константу EOF (определенную как минус единицу) в случае конца файла или ошибки чтения. Функция fputc записывает один символ в файл. При ошибке fputc возвращает константу EOF (т.е. отрицательное значение), в случае удачи - код выведенного символа c (неотрицательное значение).
В качестве примера использования функции fgetc перепишем рассмотренную ранее программу wc, подсчитывающую число символов и строк в текстовом файле:
//
// Файл "wc1.cpp"
// Подсчет числа символов и строк в текстовом файле
// с использованием функции чтения символа fgetc
//
#include <stdio.h> // Описания функций ввода-вывода
int main() {
char fileName[256]; // Путь к файлу
FILE *f; // Структура, описывающая файл
int c; // Код введенного символа
int numChars = 0; // Суммарное число символов := 0
int numLines = 0; // Суммарное число строк := 0
printf("Введите имя файла: ");
scanf("%s", fileName);
f = fopen(fileName, "rb"); // Открываем файл
if (f == 0) { // При ошибке открытия файла
// Напечатать сообщение об ошибке
perror("Не могу открыть файл для чтения");
return 1; // закончить работу программы с кодом 1
}
while ((c = fgetc(f)) != EOF) { // Читаем символ
// Цикл продолжается, пока c != -1 (конец файла)
++numChars; // Увеличиваем число символов
// Подсчитываем число символов перевода строки
if (c == '\n') {
++numLines; // Увеличиваем число строк
}
}
fclose(f);
// Печатаем результат
printf("Число символов в файле = %d\n", numChars);
printf("Число строк в файле = %d\n", numLines);
return 0; // Возвращаем код успешного завершения
}
Пример выполнения программы wc1 в применении к собственному тексту, записанному в файле "wc1.cpp:
Введите имя файла: wc1.cpp
Число символов в файле = 1334
Число строк в файле = 44
Функция fgets с прототипом
char *fgets(char *line, int size, FILE *f);
выделяет из файла или входного потока f очередную строку и записывает ее в массив символов line. Второй аргумент size указывает размер массива для записи строки. Максимальная длина строки на единицу меньше, чем size, поскольку всегда в конец считанной строки добавляется нулевой байт. Функция сканирует входной поток до тех пор, пока не встретит симол перевода строки "\n" или пока число введенных символов не станет равным size - 1. Символ перевода строки "\n" также записывается в массив непосредственно перед терминирующим нулевым байтом. Функция возвращает указатель line в случае успеха или нулевой указатель при ошибке или конце файла.
Раньше в стандартную библиотеку Си входила также функция gets с прототипом
char *gets(char *line);
которая считывала очередную строку из стандартного входного потока и помещала ее в массив, адрес которого являлся ее единственным аргументом. Отличие от функции fgets в том, что не указывается размер массива line. В результате, подав на вход функции gets очень длинную строку, можно добиться переполнения массива и стереть или подменить участок памяти, используемый программой. Если программа имеет привилегии суперпользователя, то применение в ней функции gets открывает путь к взлому системы, который использовался хакерами. Поэтому в настоящее время функция gets считается опасной и применение ее не рекомендовано. Вместо gets следует использовать fgets с третьим аргументом stdin.
При выполнении файловых операций исполняющая система поддерживает указатель текущей позиции в файле. При чтении или записи n байтов указатель текущей позиции увеличивается на n; таким образом, чтение или запись происходят последовательно. Библиотека ввода-вывода Си предоставляет, однако, возможность нарушать эту последовательность путем позиционирования в произвольную точку файла. Для этого используется стандартная функция fseek с прототипом
int fseek(FILE *f, long offset, int whence);
Первый аргумент f функции определяет файл, для которого производится операция позиционирования. Второй аргумент offset задает смещение в байтах, оно может быть как положительным, так и отрицательным. Третий аргумент whence указывает, откуда отсчитывать смещение. Он может принимать одно из трех значений, заданных как целые константы в стандартном заголовочном файле "stdio.h":
|
SEEK_CUR |
смещение отсчитывается от текущей позиции |
|
SEEK_SET |
смещение отсчитывается от начала файла |
|
SEEK_END |
смещение отсчитывается от конца файла |
Например, фрагмент
fseek(f, 0, SEEK_SET);
устанавливает текущую позицию в начало файла. Фрагмент
fseek(f, -4, SEEK_END);
устанавливает текущую позицию в четырех байтах перед концом файла. Наконец, фрагмент
fseek(f, 12, SEEK_CUR);
продвигает текущую позицию на 12 байтов вперед.
Отметим, что смещение может быть положительным даже при использовании константы SEEK_END (т.е. при позиционировании относительно конца файла): в этом случае при следующей записи размер файла соответственно увеличивается.
Функция возвращает нулевое значение в случае успеха и отрицательное значение EOF (равное -1) при неудаче - например, если указанное смещение некорректно при заданной операции или если файл или поток не позволяет выполнять прямое позиционирование.
Узнать текущую позицию относительно начала файла можно с помощью функции ftell с прототипом
long ftell(FILE *f);
Функция ftell возвращает текущую позицию (неотрицательное значение) в случае успеха или отрицательное значение -1 при неудаче (например, если файл не разрешает прямое позиционирование).
Наконец, узнать, находится ли текущая позиция в конце файла, можно с помощью функции feof с прототипом
int feof(FILE *f);
Она возвращает ненулевое значение (т.е. истину), если конец файла достигнут, и нулевое значение (т.е. ложь) в противном случае. Например, в следующем фрагменте в цикле проверяется, достигнут ли конец файла, и, если нет, считывается очередной байт:
FILE *f;
. . .
while (!feof(f)) { // цикл пока не конец файла
int c = fgetc(f); // | прочесть очередной байт
. . . // | . . .
} // конец цикла
Лекція
