
Lekcija_faily.simvoly.stroki.ppt
- Количество слайдов: 36
ФАЙЛЫ И СИМВОЛЫ
Файлы Файл – это именованная область памяти на внешнем запоминающем устройстве. Файлы служат для записи и хранения информации. Полное имя файла для С имеет следующий формат: <имя>. <тип>. Тип в имени может отсутствовать. Число символов в типе не превышает трех. Для того чтобы в языке С во время работы программы организовать ее взаимодействие с файлом на внешнем запоминающем устройстве, надо: – объявить переменную, которая называется указателем файла; – открыть файл (связать указатель файла с конкретным именем файла); – закрыть файл, если программа завершила все операции с файлом на внешнем носителе. Язык программирования С. Файлы и символы 2
Файлы (продолжение) Формат объявления переменной, которая является указателем файла, следующий: FILE *<имя>; Для связи файла на носителе с указателем в программе используется функция fopen(). Код, который открывает файл, имеет следующий вид: FILE *f 1; f 1 = fopen(“<имя файла на носителе>”, ”<режим доступа к файлу>”); Здесь: <имя файла на носителе> – имя конкретного файла на внешнем носителе; <режим доступа к файлу> задает режим доступа к файлу. Возможные режимы доступа: r – файл открыт для чтения; w–файл открыт для записи; a – файл открыт для дозаписи в конец; r+ – файл открыт для чтения и записи; w+ – файл открыт для записи и чтения. Функция fopen() возвращает указатель файла. Если при открытии файла произошла ошибка, то функция возвращает NULL. Для подтверждения того, что функция fopen() выполнилась успешно, можно использовать следующий набор операторов: Язык программирования С. Файлы и символы 3
Файлы (продолжение) FILE *f 1; if ((f 1 = fopen( “t. txt”, “r”)) != NULL) { // Если файл открыт, то выполняется блок операторов в скобках. } else // Если файл не открыт, то выдается сообщение об ошибке. printf(“Ошибка при открытии файла!!! n”); Здесь t. txt есть файл с информацией, который записан на внешнем носителе. Закрывает доступ к файлу функция fclose(f 1), где f 1 – указатель на открытый ранее файл. Для ввода информации из файла в память компьютера используется директива форматного ввода fscanf(). Формат директивы для считывания информации из файла имеет следующий вид: fscanf( F, <управляющая строка>, <список переменных>). Для записи информации из памяти компьютера в файл используется директива форматного ввода fprintf(). Формат директивы для записи информации в файл имеет следующий вид: fprintf( F, <управляющая строка>, <список переменных>). Язык программирования С. Файлы и символы 4
Программа вводит целое число из файла и записывает число в новый файл. void main(void) { FILE *f 1; // Объявляет файловую переменную. int n; /* Ввод из файла */ if( (f 1 = fopen("num. txt", "r")) != NULL) { fscanf( f 1, "%d", &n); printf("n= %d", n); fclose(f 1); // Запись числа в файл. n = n * n; f 1 = fopen("t 1_w. txt", "w"); fprintf( f 1, "%d ", n ); fclose(f 1); } else printf(" Файл не открыт. n"); getch(); } Язык программирования С. Файлы и символы 5
П р о г р а м м а FL 2. Ввод массива в память компьютера из файла при заданном количестве чисел. void main() { const n = 10; FILE *f 1; int i, a[n]; // n – для числа элементов в массиве. // Определяется файловая переменная f 1 = fopen("t 1. txt", "r"); for (i = 0; i <= n - 1; i++) fscanf( f 1, "%d", &a[i] ); fclose(f 1); f 1 = fopen("t 1_w. txt", "w"); for (i = 0; i <= n - 1; i++) fprintf( f 1, "%d ", a[i] ); // fprintf – директива записи данных в файл. fclose(f 1); } Язык программирования С. Файлы и символы 6
Программа. Ввод массива по признаку конца файла. void main(void) { const n = 100; // Определяется число элементов в массиве. FILE *f 1; // Определяется файловая переменная. int i = -1, a[n], nr; f 1 = fopen("t 1. txt", "r"); do { i++; // !!! Формируем индекс элемента файла. fscanf( f 1, "%d", &a[i] ); } while (!feof(f 1 )); // Ввод чисел до признака конца файла. fclose(f 1); // Запись элементов массива в файл. nr = i; // В nr засылаем число элементов в массиве. f 1 = fopen("t 1 w. txt", "w"); for (i = 0; i <= nr; i++) fprintf(f 1, "%d ", a[i] ); // fprintf – директива записи данных в файл. fclose(f 1); } Такой способ ввода информации удобен, когда заранее не известно число элементов в массиве. Язык программирования С. Файлы и символы 7
Символы Для объявления символьных переменных в языке С используется ключевое слово char. Этот тип переменных выделяет 1 байт для записи символов и определяет целые числа без знака в диапазоне от 0 до 255. Для идентификации символов используется код ASCII. Это означает, что каждому символу строго соответствует некоторое число. Формат объявления символьных переменных имеет следующий вид: char <имя>. При объявлении символьной переменной ее можно инициализировать. Например, код char c 1 = ‘*’ выделяет область памяти с именем c 1 и засылает в нее символ *. Символ в одинарных кавычках называется символьной константой. Для ввода символа с клавиатуры можно использовать следующие функции: getchar() – возвращает символ, введенный с клавиатуры после активизации клавиши Enter; Язык программирования С. Файлы и символы 8
getch() – возвращает символ, введенный с клавиатуры. Введенный символ на экран не отображается; getche() – возвращает символ, введенный с клавиатуры. Введенный символ отображается на экране; cin – бесформатный ввод символа. Для ввода символа в переменную надо нажать последовательно соответствующую клавишу символа, а затем клавишу Enter; scanf() – форматный ввод символа. Для ввода символа в переменную надо нажать соответствующую клавишу символа, а затем клавишу Enter. Спецификация формата ввода (вывода) символов имеет вид %c. Возможен, например, следующий формат кода с функцией scanf(): scanf(%c%c%c”, &w, &al, &yy), здесь w, a 1, yy – переменные символьного типа. Эта директива обеспечивает ввод символов в переменные w, a 1, yy. Для ввода символов по этой директиве надо на клавиатуре набрать через пробелы три символа и нажать клавишу Enter. В языке С возможен код int n; n = ‘q’; В этом случае в переменную n засылается число 113, которое является кодом символа q. Язык программирования С. Файлы и символы 9
Программа. Для ввода символа с клавиатуры используются различные функции. void main() { char z = 'w'; cout << "При объявлении переменной z ей присвоено значение = " << z << "nn"; cout << "Введи символ с клавиатуры” << “ (После набора символа нажми ENTER): "; scanf("%c", &z); cout << "При вводе в переменную z символа " << z << "n использовалась функция scanf() nn"; cout << "Введи символ с клавиатуры” << “ (После набора символа нажми ENTER): "; cin >> z; cout << "При вводе в переменную z символа " << z << "n использовалась функция cin nn"; cout << "Введи символ с клавиатуры n " << "(ввод происходит при нажатии клавиши клавиатуры): "; z = getche(); Язык программирования С. Файлы и символы 10
cout << "n. При вводе в переменную z символа " << z << "n использовалась функция getche() nn"; cout << "Введи символ с клавиатуры n" << "(ввод происходит при нажатии клавиши клавиатуры): "; z = getch(); cout << "n. При вводе в переменную z символа " << z << "n использовалась функция getch() nn"; z = 23; // В переменную z заносится символ, код которого равен 23. cout << "В переменную z введен символ директивой z = " << (int) z << "n"; cout << "Коду (числу) " << (int) z << " соответствует символ " << z << "nn"; getch(); } Язык программирования С. Файлы и символы 11
Продемонстрируем трассировку работы программы. При объявлении переменной z ей присвоено значение = w Введи символ с клавиатуры. После набора символа s нажми ENTER. При вводе в переменную z символа s использовалась функция scanf(). Введи символ с клавиатуры. После набора символа r нажми ENTER. При вводе в переменную z символа r использовалась функция cin. Введи символ t с клавиатуры (ввод происходит при нажатии клавиши клавиатуры). При вводе в переменную z символа t использовалась функция getche() Введи символ g с клавиатуры (ввод происходит при нажатии клавиши клавиатуры). При вводе в переменную z символа g использовалась функция getch(). В переменную z введен символ директивой z = 23. Язык программирования С. Файлы и символы 12
Для вывода символов можно использовать либо форматный вывод printf(), либо бесформатный cout, либо функцию putchar(). Формат директив при выводе символов на экран может быть, например, таким: – putchar(c); – cout << “В переменной w содержится символ = “ << w << “n”; – printf “В переменную z введен символ %cn”, z; – cout << “В переменную t введен символ “ << putchar(t). Здесь c, w, z, t – переменные символьного типа. Все эти директивы выведут на экран символы, которые находятся в c, w, z, t. Язык программирования С. Файлы и символы 13
Программа выводит ASCII код символа. void main() { char ch; cout << " Введи символ ( Enter – выход из программы )n "; do { ch = getch(); // Ввод символа с клавиатуры. if (ch != 13) // 13 – код символа Enter. cout << "Cимволу " << ch // Вывод символа на экран. << " cоответствует код " << (int) ch // Вывод кода символа. << "n"; else cout << "Cимволу Enter " << " cоответствует код " << (int) ch << "n"; } while (ch != 13); // Продолжать ввод, пока не введен символ Enter. cout << "n. Для выхода из программы нажми любую клавишу. n "; getch(); } При работе программы запрашивается ввод символа. После ввода символа, например, q на экран выводится сообщение: Символу q соответствует код 113. Работа программы будет продолжаться до тех пор, пока не будет нажата клавиша Enter. Язык программирования С. Файлы и символы 14
Программа посимвольно считывает текст из файла и выводит этот текст на экран. void main() { FILE *f 1; char c 1; cout << "Программа выводит текст, “ << “который вводится из файла посимвольно. n"; f 1= fopen("str. txt", "r"); // Открываем файл с текстом. do {c 1 = getc(f 1); // В переменную c 1 из файла вводим символ. printf("%c", c 1); // Выводим символ на экран. } while (!feof(f 1 )); // Цикл, пока не конец файла. fclose(f 1); getch(); } Язык программирования С. Файлы и символы 15
Программа выводит на экран символы английского алфавита. void main() { char ch; cout << "Символы английского алфавита: n"; for (ch = 'a'; ch <= 'z'; ch++) // Цикл от a до z. cout << ch << " "; // Вывод управляющего параметра цикла на экран. cout << "n"; getch(); }. Результат работы программы – символы английского алфавита: a b c d e f g h i j k l m n o p q r s t u v w x y z Язык программирования С. Файлы и символы 16
Программа выводит на экран символы русского алфавита. void main() {char ch; cout << "Символы русского алфавита: n"; for ( ch = 'а'; ch <= 'я'; ch++ ) if( ! (ch > 'п' && ch < 'р')) cout << ch << " "; cout << "n"; getch(); }. Результат работы программы символы русского алфавита: абвгдежзи й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я Замечание. Условный оператор if(!(ch > 'п' && ch < 'р')) в программе используется потому, что между русскими буквами ‘п’ (код 175) и ‘р’ (код 224), находятся символы, которые не являются буквами русского алфавита. Коды упомянутых символов начинаются от значения 176 и заканчиваются значением 223. Оператор if(!(ch > 'п' && ch < 'р')) исключает вывод этих символов на экран. Язык программирования С. Файлы и символы 17
Стандартные программы, которые используются в языке С для анализа символов. Стандартные программы находятся в файле
СТРОКИ И МАССИВЫ СТРОК
Строки Используя символьные переменные, можно сформировать две структуры данных: массив символов и строки. Массив есть множество элементов одного типа. Строка – это массив символов, последним элементом которого является символ ‘ ’ (обратный слеш, 0), называемый концом строки. Принципиальная же разница между строкой и массивом состоит в том, что присутствие в строке символа ‘ ’ неявно задает размер массива. Форма объявления массива символов в языке С имеет следующий вид: char <имя>[<размер>]. Специального формата для объявления строки в языке С не существует. Но строку можно определить, инициализируя значения массива символов строковой константой. Строковая константа – это набор символов в двойных кавычках. Возможны следующие варианты инициализации: char s[]=“Саша – очень умный мальчик! ”; char s 2[10] = “Ура!!!”; char *s 3 = “Три мудреца в одном тазу. ”; char s 4[20] = “ “; Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 20
Для ввода строк с клавиатуры можно использовать функции: scanf() – функция форматного ввода строки; gets()– функция бесформатного ввода строки; cin – директива бесформатного ввода строки. Программа вводит строки с клавиатуры с использованием функции scanf(). Функция вводит текст до первого пробела. void main() { char a[80]; cout << "Введи строку (Ctrl + z Enter – конец ввода )n"; do { scanf("%s", a); if (!feof(stdin)) cout << "!!!! " << a << "n"; } while (!feof(stdin)); } Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 21
Последовательность работы программы при вводе одной строки: • запустить программу. После подсказки: Введи строку (Ctrl + z Enter – конец ввода ); • набрать строку: Наша Таня громко плачет; • нажать Enter; • На экране появится следующая информация: !!!! Наша !!!! Таня !!!! громко !!!! Плачет. Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 22
Программа вводит строки с клавиатуры, используя функцию gets(). void main() { char a[80]; cout << "Введи строку (Ctrl + z Enter – конец ввода)n"; while (!feof(stdin)) { gets(a); cout << "!!!! " << a << "n"; }} Последовательность работы программы при вводе одной строки: запустить программу. После подсказки: Введи строку (Ctrl + z Enter – конец ввода); • набрать строку: Наша Таня громко плачет; • нажать Enter. На экране выдачи результатов появится следующая информация: !!!! Наша Таня громко плачет Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 23
Программа вводит строки с клавиатуры, используя директиву cin. void main() { char a[80]; cout << "Введи строку n"; do { cin >> a; cout << "!!!! " << a << "n"; cout << "Продолжать ввод? (Enter – да)n"; } while (getch() == 13); } Последовательность работы программы при вводе одной строки: • запустить программу. После подсказки: Введи строку; • набрать строку: Наша Таня громко плачет; • нажать Enter; Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 24
На экране выдачи результатов появятся слова: !!!! Наша Продолжать ввод? (Enter – да) При нажатии Enter на экране появятся слова: !!!! Таня Продолжать ввод? (Enter – да) При нажатии Enter на экране появятся слова: !!!! громко Продолжать ввод? (Enter – да) При нажатии Enter на экране появятся слова: !!!! плачет Продолжать ввод? (Enter – да) После вывода последнего слова строки можно продолжать вводить строки. Если в процессе работы программы после подсказки: Продолжать ввод? (Enter – да) будет нажата не клавиша Enter, а любая другая, то программа завершит работу. Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 25
Для ввода строк из файла используются функции: fscanf() – функция форматного ввода текста из файла; fgets() – функция бесформатного ввода текста из файла. Формат кодов при использовании этих функций имеет следующий вид: fscanf(f 1, ”%s”, str); fgets(str, k, f 1). Здесь f 1 – имя файловой переменной; str – имя массива символов; “%s” – управляющая строка для функции fscanf(); k – параметр целого типа (fgets вводит в str всю строку, если число символов в строке меньше или равно k – 1). При успешном завершении работы функции fgets() в str засылается строка из файла f 1. При выполнении функции fscanf() в str последовательно засылается из файла набор символов, расположенных между пробелами. Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 26
Программа вводит текст из файла, используя функцию fscanf(). Наборы символов между пробелами последовательно засылаются в s 1. void main(void) { FILE *f 1; char s 1[81]; f 1 = fopen("t. txt", "r"); do { fscanf(f 1, "%s", s 1); printf("%s n", s 1); // Объявляется файловая переменная f 1. // Объявляется массив символов. // Открываем файл t. txt. // Ввод из файла t. txtв s 1 набор символов // между пробелами. // Вывод на экран информации из s 1. } while (!feof(f 1 )); // Вводить информацию из файла до конца файла. fclose(f 1); getch(); }. Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 27
Программа вводит текст из файла, используя функцию fgets(). void main(void) { FILE *f 1; // Объявляется файловая переменная f 1. char s 1[81]; // Объявляется массив символов. f 1 = fopen("t. txt", "r"); // Открываем файл t. txt. do { fgets(s 1, k, f 1); // Ввод строки в s 1 из файла t. dat. printf("%s n", s 1); // Вывод на экран информации из s 1. } while (!feof(f 1 )); // Вводить информацию из файла до конца файла. fclose(f 1); getch(); }. Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 28
Под строки можно выделять динамическую память. Так, в результате выполнения фрагмента программы: char *str; // Объявляется указатель. int k; // Параметр k – для размера массива. cout << “Введи размер для строки: ”; cin >> k; str = new char [k]; под строку выделяется массив для символов размерностью k. В заключение перечислим некоторые стандартные функции для строк, которые можно использовать в языке С. Функции содержатся в файле
strstr(st 1, st 2) определяет, содержится ли строка st 2 в строке st 1. Если содержится, то strstr возвращает значение указателя на первое вхождение st 2 в st 1. Иначе strstr возвращает нулевой указатель. Strcmp(st 1, st 2) сравнивает в алфавитном порядке строки st 1 и st 2: при st 1 < st 2 значение сравнения отрицательно; при st 1 = st 2 значение сравнения равно нулю; при st 1 > st 2 значение сравнения положительно; atof(st) преобразует строку st в вещественное число типа double; atoi(st) преобразует строку st в десятичное целое число; atol(st) преобразует строку st в длинное десятичное целое число; itoa(int k, char *st, int baz) преобразует целое число k в строку st, переменная baz – основание (2 baz 36); ltoa(int k, char *st, int baz) преобразует длинное целое число k в строку st, переменная baz – основание (2 baz 36). Замечание. Функцию strcmp можно использовать для сортировки слов по алфавиту. Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 30
Массивы строк Массив строк – это двумерный символьный массив. Например, код char str[10][81]; задает 10 строк по 80 символов каждая. Наиболее удобной формой выделения памяти под массив строк является выделение динамической памяти. Для этого, в простейшем случае, в программе следует предварительно объявить массив указателей типа char. Размер массива указателей может превышать или соответствовать количеству ожидаемых строк. Программа вводит с клавиатуры массив строк. Память под строки выделяется в процессе работы программы, т. е. динамически. Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 31
const n = 20; void main() { char *st[n]; // Объявляется массив указателей. int k = -1, i; printf("Введи строки (для окончания ввода нажми Ctrl + z Enter). n"); do { k++; // Формируем индекс для ввода очередной строки. st[k] = new char[81]; // Выделяем память для ввода строки. } while (gets(st[k]) != NULL); // Ввод и проверка // завершения ввода строки. printf("nn. Введены %d строки: n", k); for (i = 0; i < k; i++) printf("%sn", st[i]); // Вывод массива строк. getch(); } Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 32
Программа вводит из файла массив строк. void main() { FILE *f 1; char *st[20]; // Определяется массив указателей. int k = -1, i; f 1 = fopen("t. txt", "r"); // Открывается файл с информацией. do { k++; // Формируем индекс для текущей строки. st[k] = new char[81]; fgets(st[k], 79, f 1); } while (!feof(f 1)); printf("n Из файла ввели %d строки: n", k); for (i = 0; i < k; i++) printf("%s", st[i]); getch(); } Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 33
Программа вводит из файла массив строк. void main() { FILE *f 1; char **st; int n, len, k = -1, i; cout << "Введи количество строк "; cin >> n; st = new char *[n]; // Выделяется память под массив указателей. cout << "Введи число символов в строке "; cin >> len; // Определяется число символов в строке. f 1 = fopen("t. txt", "r"); do { k++; st[k] = new char[len]; fgets(st[k], 79, f 1); // Вводим в строку st[k] информацию из файла. } while (!feof(f 1)); printf("n Из файла ввели %d строки: n", k); for (i = 0; i < k; i++) printf("%s", st[i]); // Вывод массива строк на экран. getch(); } Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 34
Массив строк можно задавать при объявлении переменных. Это, например, достигается следующим кодом: char *str[] = {“Воскресенье”, “Понедельник”, “Вторник”, “Среда”, “Четверг”, “Пятница”, “Суббота”}; void main() { char *st[100], sr[81]; int k = -1, i, j, im; FILE *f 1; sr[80]= ' '; f 1 = fopen("t. txt", "r"); do { k++; st[k] = new char[81]; // Выделяется память под строку. fgets(st[k], 79, f 1); // Ввод строки из файла. } while (!feof(f 1)); cout << " До сортировки: n"; for (i = 0; i < k; i++) printf("%s", st[i]); getch(); clrscr(); Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 35
// Сортировка по алфавиту. for (i = 0; i <= k; i++) { im = i; for (j = i+1; j < k; j++) if (strcmp( st[im], st[j]) > 0) im = j; strcpy(sr, st[i]); // Перестановка строк. strcpy(st[i], st[im]); strcpy(st[im], sr); } cout << "n После сортировки: n"; for (i = 0; i < k; i++) printf("%s", st[i]); getch(); } Язык программирования С. Строки и массивы строк. Доступ к функциональным клавишам 36