Лекции (1171139), страница 11
Текст из файла (страница 11)
Значение возвращается в виде смещения в байтах относительноначала файла. Значение, возвращаемое функцией ftell, в дальнейшем можноиспользовать при вызове функции fseek. Ftell возвращает положение указателятекущей позиции при успешном завершении.При ошибке возвращается значение.long int ftell( FILE *stream);fseek – устанавливает адресный указатель файла, соответствующий потокуstream, в новую позицию, которая расположена по смещениюoffset относительно места в файле, определенного параметромfromtwhere. Параметр fromtwhere может иметь одно из трех значений 0,1 или 2, которые представлены тремя символическими константами, определеннымив файле stdio.h, следующим образом:SEEK_SET(0) – начало файла, SEEK_CUR(1) – позиция текущего указателя файла,SEEK_END(2) – конец файла(EOF); Функция fseek возвращает значение 0, еслиуказатель файла успешно перенесен, и ненулевое значение в случае неудачногозавершения.int fseek(FILE *stream, long int offset, int fromwhere);fgetpos – сохраняет позицию указателя файла, связанного с потоком stream, вместе, указываемом параметром pos.
При успешном завершении fgetpos возвращает0.int fgetpos(FILE *stream, fpos_t *pos);Здесь и далее fpos_t - предварительно объявленный тип typedef long fpos_t.fsetpos - устанавливает указатель текущей позиции файла, связанного с потокомstreamвновуюпозицию,котораяопределяетсязначением,получаемымпредшествующим вызовом функции fgetpos. При успешном завершении fsetposвозвращает 0.Int fsetpos( FILE *stream, const fpos_t *pos);fgetc – получает символ из потока stream.int fgetc(FILE *stream);fgetchar – получает символ из потока stdin.int fgetchar( void );fgets – получает строку s длиной не более n символов из потокаstream.char *fgets(char *s, int n, FILE *stream);fputc – выводит символ с в поток stream.int fput(int c, FILE *stream);fputchar- выводит символ c в поток stdout.int fputchar(int c);fputs – выводит строку символов string в поток stream.int fputs(char *string, FILE *stream);gets – получает строку символов s из потока stdin.char *gets(char *s);getc – выводит из потока stream символ этого потока.int getc(FILE *stream);getchar – выводит символ из потока stdin.int getchar( void );putc – выводит символ c в поток stream.int putc(int c, FILE *stream);putchar – выводит символ с в поток stdout.int putchar(int c);puts – выводит строку s в поток stdout.int puts(const char *s);37putw – помещает в поток stream целое значение w.int putw(int w, FILE *stream);getw – вводит из потока stream целое число.int getw(FILE *stream);fread – считывает n элементов данных длиной size из потока streamпо адресу ptr.size_t fread(void *ptr, size_t size, size_t n, FILE *stream );Здесь и далее size_t – предварительно объявленный в библиотекетип typedef usigned size_t.fwrite – записывает n элементов данных длиной size из ptr и потокstream.Size_t fwrite( void *ptr, size_t size, size_t n, FILE *stream);Функции форматированного ввода-выводаprintf – производит форматированный вывод в stdout.int printf(const char *format [,argument,…]);scanf – выполняет форматированный вывод из потока stdin.int scanf(const char *format [,adress,…]);fprintf – посылает форматированный вывод в поток stream.int fprintf(FILE *stream, const char *format [,argument,…]);fscanf – выполняет форматированный ввод из потока stream.int fscanf(FILE *stream, const char *format [,adress,…]);sprintf – производит форматированный вывод в сстроку buffer.int sprintf(char *buffer, const char *format [,argument,…]);sscanf – выполняет форматированный ввод из строки buffer.Int sscanf(const char *buffer, const char *format [,adress,…]);Функции ввода-вывода на экран(conio.h)cprintf – осуществляет форматированный вывод на экран.int cprintf(const char *format [,argument,…]);Файлы и их назначениеЗаголовочный файлassert.hctype.herrno.hfloat.hlimits.hlocale.hmatch.hsetjmp.hsignal.hstdarg.hstddef.hstdio.hstdlib.hstring.htime.hНазначениеДиагностика программПреобразование и проверка символовПроверка ошибокРабота с числами с плавающей точкойОпределение размеров целочисленных типовПоддержка интернациональной средыМатематическая библиотекаВозможность нелокальных переходовОбработка сигналовПоддержка функций с неопределенным числом параметровРазноеБиблиотека стандартного ввода-выводаФункции общего назначенияФункции работы со строками символовФункции работы с датами и временемgetch – читает один символ с консоли без вывода его на экран.int getch(void);getche – cчитывает один символ с консоли и отображает его в текущем текстовомокне экрана.int getche( void );putch – выводит символ на экран.int putch(int c);Каждая библиотечная функция , определенная стандартом языка С, имеетпрототип в соответствующем заголовочном файле.
В соответствие со стандартом ANSIязыка С должно быть 15 следующих заголовочных файлов.На самом деле каждый изкомпиляторов содержит , как правило больше заголовочных файлов, например –38библиотеку функций работы с графическим экраном graphics.h и библиотеку функций дляработы с текстовым экраном conio.h.ЗАДАНИЯ1. Составьте программу, которая распечатывает последние n строк файла ввода.2. Напишите программу, которая читает 2 файла и печатает их вперемежку: одна строка изпервого файла, другая - из второго. Придумайте, как поступить, если файлы содержатразное число строк.3.
Дан текстовый файл f. Найти и pаспечатать самую длинную стpоку этого файла.4.Пусть имеется файл, содеpжащий пpогpамму на Си. Напишите пpогpамму, удаляющуюиз текста пpогpаммы на С комментаpии.ЗАДАНИЯ НА ДОМ1. Пусть файл содержит записи о сотрудниках некоторого учреждения. Каждая записьвключает порядковый номер записи, фамилию, имя сотрудника, его номер телефона ивозраст:1 Иванов Иван 1234567 252 Петров Петр 2345678 27…Напишите программу, которая выводит меню с доступными операциями:1 – добавить новую запись (при добавлении новой записи проверять нет ли ужетакой записи в файле)2 – редактировать запись (вводится номер записи)3 – искать запись по фамилии (если имеются однофамильцы, выводить все записис одинаковыми фамилиями)4 – удалить запись по порядковому номеру5 – завершить работу программыКаждую из операций оформить в виде отдельной функции.2.
Пусть файл содержит информацию о наличии книг в магазине. Каждая запись включаетномер ISBN книги, автора, название, количество книг:9666965348 Стругацкие Град обреченный 2585845908914 Керниган, Ритчи Язык программирования C 129…Напишите программу, которая выводит меню с доступными операциями:12345–––––добавить новую книгу (при добавлении проверять нет ли уже такой книги)редактировать запись (вводится номер ISBN)поиск книг одного автора (вывести все книги по введенной фамилии автора)изменить количество книг (по введенному номеру ISBN)завершить работу программыКаждую из операций оформить в виде отдельной функцииПрограмма должна иметь следующую структуру:Lab1.c – файл, содержащий функцию mainLab1_func.c – файл, содержащий реализацию функций программы.Lab1.h – заголовочный файл, содержащий глобальные переменные и заголовки функций.Варианты:1.
задание 1 реализовать функции 1,3,52. задание 1 реализовать функции 2,4,53. задание 2 реализовать функции 1,3,54. задание 2 реализовать функции 2,4,539МассивыМассив в Си — это набор элементов одного типа, обратиться к которым можно по индексу.Элементы массивов в C расположены друг за другом в памяти компьютера. Двумерные массивы Си — этопрямоугольная таблица чисел. Двумерный массив C состоит из рядов и столбцов. Первый индексдвумерного массива C — это число рядов, а второй индекс — это число столбцов. Описание массива в Сисостоит из имени базового типа, названия массива и его размера, который указывается в квадратныхскобках.
Размер массива обязательно должен быть целочисленной константой или константнымвыражением. Примеры:int a[10];char c[256];double d[1000];В первой строке описан массив целых чисел из 10 элементов. Подчеркнем, что нумерация в Си всегданачинается с нуля, так что индексы элементов массива изменяются в пределах от 0 до 9. Во второй строкеописан массив символов из 256 элементов (индексы в пределах 0...255), в третьей - массив вещественныхчисел из 1000 элементов (индексы в пределах 0...999). Для доступа к элементу массива указывается имямассива и индекс элемента в квадратных скобках, например:a[10], c[255], d[123]Объявление массива сводится к указанию типа его элементов и количества элементов по каждомуизмерению:#define Nmax 50/*директива define указывает процессору на то, что встречающееся в коде обозначение Nmax следуетзаменить на значение 50 */char a1[20],a2[2][80];int b1[25],b2[Nmax];По такому объявлению компилятор будет знать, сколько места в оперативной памяти понадобится дляхранения такого массива.
Для глобальных массивов место в памяти будет выделено в момент запускапрограммы, а для локальных – в момент вызова соответствующей функции.Объявление массива можно совместить с его инициализацией, т.е. с присвоением начальных значений всемэлементами массива или только нескольким первым элементам:char a[7]="Привет";char b[7]={'П','р','и','в','е','т',0x0};char c[]="Привет";float d[10]={1.,2.,3.,4.};int q[2][3]={{1,2,3},{4,5,6}};Обратите внимание на инициализацию символьных массивов a, b и c. В первом случае значенияэлементов массива совпадают с символами указанной строковой константы. Хотя значащих символов там 6,не следует забывать и о невидимом признаке конца строки – байте с нулевым значением. В случаеинициализации массива b каждый его элемент задан символьной константой, не забыть и признак концастроки. Самый удобный способ использован при инициализации массива c – вместо того, чтобы указыватьколичество элементов, здесь заданы пустые скобки.
Компилятор по заданному значению текстовойконстанты сам определит нужное количество байтов. Это позволяет избежать ненужных ошибок приподсчете количества символов в достаточно длинных строках. При инициализации массива d вместо десятизначений заданы только четыре. Это означает, что указанные величины будут присвоены только первымчетырем элементам. Остальные элементы не инициализированы. В случае если d является глобальныммассивом, значения этих элементов будут равны 0 (память, выделяемая глобальным данным,предварительно чистится).
Если массив d локализован в какой-то функции, то значения его элементов,начиная с d[4], предсказать невозможно – там будет находиться "мусор", которая при повторных вызовахфункции может оказаться разной.Инициализация двумерных массивов выглядит более естественно, если значения элементов строкрасполагать друг под другом (так как это сделано в инициализации массива q).Оператор sizeof возвращает размер всего массива в байтах, а не в элементах массива.
В данном примере:sizeof(a) = 10*sizeof(int) = 40,sizeof(c) = 256*sizeof(char) = 256,sizeof(d) = 1000*sizeof(double) = 800040ЗАДАНИЯ1. Написать программу поиска минимального элемента массива из n элементов.2.Дана последовательность из 20 целых чисел. Определить количество инверсий в этойпоследовательности (то есть пар таких элементов, в которых большее число находитсяслева от меньшего: x[i] > x[j] при i<j).3.