- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Организация посимвольного ввода и вывода
В языке С определены две эквивалентные функции, предназначенные для вывода (записи) символов в файл: putc() и fputc(). Функция putc() записывает символы в открытый ранее файл для записи. Прототип putc имеет вид:
int putc(int ch, FILE *f);
где f — это указатель файла a ch — выводимый символ. В случае если запись выполнилась успешно, то возвращается записанный символ, иначе возвращается EOF.
Ввод (чтение) символа из файла, открытого для чтения, обеспечивается парой функций: getc() и fgetc(). Прототип функции getc():
int getc(FILE *уф);
Функция getc() возвращает целое значение, младший байт которого содержит ASCII-код символа. Старший байт при этом обнулен.
При достижении конца файла, функция getc() возвращает EOF. Пример фрагмента программы чтения символов до конца текстового файла:
do
{ ch = getc(f);
} while(ch!=EOF);
Однако getc() возвращает EOF и в случае ошибки.
Определение конца файла feof()
Как Выше отмечалось при прочтении конца файла функция getc() возвращает EOF. Однако EOF может быть возвращен и в случаях, когда конец файла еще не достигнут. Во-первых, когда файл открывается для двоичного ввода, то прочитанное значение, может совпадать с EOF. При этом программа зафиксирует достижение конца файла, чего на самом деле может и не быть. Во-вторых, функция getc() возвращает EOF и при ошибке ввода, когда недостигнут конец файла. Для решения этой проблемы в С имеется функция feof(), которая определяет, достигнут ли конец файла. Прототип функции feof():
int feof(FILE *f);
Если конец файла достигнут, то feof() возвращает true, иначе нуль. Поэтому следующий код будет читать двоичный файл до тех пор, пока не будет достигнут конец файла:
while(!feof(fp))
{ ch = getc(fp);
if(!feof(in)) printf("%c"ch);
}
Организация ввода и вывода строк
Функции fgets() и fputs() обеспечивают построчный ввод и вывод информации. Первая читает строки символов из файла, а вторая записывает строки в файл. Прототипы этих функций следующие:
int fputs(const char *str, FILE *f);
char *fgets(char *str, int len, FILE *f);
Функция fputs() записывает в поток строку, на которую указывает str. В случае ошибки эта функция возвращает EOF.
Функция fgets() читает из потока строку, до тех пор, пока не будет прочитан символ новой строки или количество прочитанных символов не станет равным len-1. Если был прочитан разделитель строк, он преобразуется в '\0' и записывается в строку. При успешном завершении работы функция возвращает str, а в случае ошибки — пустой указатель (null).
В следующем фрагменте программе используется функция fputs() для записи в файл строк, считываемых с клавиатуры. Ввод в файл завершается вводом пустой строки.
char str[60];
FILE *f;
if((fp = fopen("test", "w"))==NULL)
{ printf("Ошибка при открытии файла.\n");
exit(1);
}
do
{ printf("Введите строку (пустую - для выхода):\n");
gets(str); // ввод строки с клавиатуры
if(*str='\0') break; // введена пустая строка
strcat(str, "\n"); // добавление разделителя строк
fputs(str, fp); // запись введенной строки в файл
} while(*str!='\n');