Лекция: Общее знакомство
Вид материала | Лекция |
- Жизнь Клима Самгина (общее знакомство) утопия, 27.58kb.
- Лекция Общее знакомство с организмом человека Человек и окружающая среда, 81.53kb.
- Цель дисциплины, 24.29kb.
- Тема пояснения, 99.97kb.
- Общее знакомство с цветковыми растениями, 1421.63kb.
- Образовательные программы : дошкольное общее образование, начальное общее образование,, 549.09kb.
- План «курсы трейдинга» День 1 Вступительная лекция Знакомство. Базовые понятие о трейдинге., 56.64kb.
- Ю. Б. Введение в общую психологию. М., 2000. Лекция, 413.91kb.
- Урок литературы по рассказу саши черного "в лунную ночь", 85.66kb.
- Лекция со студентами асс, 33.36kb.
В заголовке
В заголовке
В заголовке
В заголовке
В заголовке
В заголовке
В заголовке
определяется набор функций, предназначенных для получения учетной информации о пользователях.
В заголовке
В заголовке
Доступ в библиотеку языка Си
Получение доступа к библиотеке зависит от системы. Во-первых, есть несколько различных мест расположения библиотечных функций, Например, getchar( ) обычно задают как макроопределение в файле stdio.h, в то время как strlen( ) обычно хранится в библиотечном файле. Во-вторых, различные системы имеют разные способы доступа к этим функциям. Вот три из них.
^
Автоматический доступ
Во многих больших системах UNIX вы только компилируете программы. А доступ к более общим библиотечным функциям выполняется автоматически.
^
Включение файла
Если функция задана как макроопределение, то можно директивой #include включить файл, содержащий ее определение. Часто подобные функции могут быть собраны в соответствующим образом названный заголовочный файл. Например, некоторые системы имеют файл ctype.h, содержащий макроопределения, задающие тип символа (прописная буква, цифра и т.д.)
^
Включение библиотеки
На некотором этапе компиляции или загрузки программы вы можете выбрать библиотеку. Даже система, которая автоматически контролирует свою стандартную библиотеку, может иметь другие библиотеки редко применяемых функций, и эти библиотеки следует запрашивать явно, указывая соответствующий признак во время компиляции.
Очевидно, мы не сможем рассмотреть все особенности всех систем, но эти три примера показывают, что вас ожидает!
^
Связь с файлами
Один способ организации связи программы с файлом заключается в использовании операций переключения < и >. Этот метод прост, но ограничен. Язык Си предоставляет и более мощные методы связи с файлами. Рассмотрим использование функции fopen( ), которая открывает файл, затем применяются специальные функции ввода-вывода для чтения файла или записи в этот файл и далее используется функция fclose( ) для закрытия файла. Прежде чем исследовать эти функции, кратко познакомимся с сущностью файла.
^ Файл является частью памяти, обычно на диске, со своим именем. Мы считаем, что он содержит некоторую полезную информацию. Для операционной системы файл более сложен, но это системные проблемы, а не наши. Но мы должны знать, что означает файл для программы на языке Си. В предлагаемых для обсуждения функциях, работающих с файлами, язык Си рассматривает файл как структуру. Вот типичный пример, взятый из IBM-версии компилятора Lattice C:
struct_iobuf {
char*_ptr; /* текущий указатель буфера*/
int_cnt; /* текущий счетчик байтов*/
char*_base; /* базовый адрес буфера ввода-вывода*/
char_flag; /* управляющий признак*/
char_file; /* номер файла*/
}
#define FILE struct_iobuf /* краткая запись*/
Здесь мы не собираемся разбираться детально в этом определении. Главное состоит в том, что файл является структурой, и что краткое наименование шаблона - FILE. Многие системы используют директиву typedef для установления этого соответствия. Таким образом, программа, имеющая дело с файлами, будет использовать тип структуры FILE, чтобы делать так.
Рассмотрим пример чтения содержимого файла, названного File, и вывода его на экран:
#include
main( )
{
FILE *in; /* описываем указатель на файл */
int ch;
if ((in = fopen("File", "r") ) != NULL) {
/*открываем File для чтения,
проверяя существует ли он */
/* указатель FILE ссылается теперь на File */
while ((ch = getc(in) != EOF))
/* получаем символ из in*/
putc(ch, stdout);
/* посылаем ch на стандартный вывод*/
fclose(in); /* закрываем фаил*.
}
else
printf (" Файл не открывается\"File\".\n);
}
Объясним работу: fopen( ), fclose и использование функций ввода-вывода файла.
^
Открытие файла: fopen( )
Функцией fopen( ) управляют три основных параметра. Первый - имя файла, который следует открыть. Он является и первым аргументом fopen( ). В нашем примере это "File". Второй параметр описывает, как должен использоваться файл:
"r" - файл нужно считать,
"w" - файл нужно записать,
"a" - файл нужно дополнить.
"w+" - новый текстовый файл открывается для записи и последующих многократных исправлений. Если файл уже существует, то предыдущее содержимое стирается. Последующие после открытия файла запись и чтение из него допустимы в любом месте файла, в том числе запись разрешена и в конце файла, т.е. файл может увеличиваться.
"r+" - существующий текстовый файл открывается как для чтения, так и для записи в любом месте файла; однако в этом режиме невозможна запись в конец файла, то есть недопустимо увеличение размеров файла.
"a+" - текстовый файл открывается или создается, если файла нет, и становится доступным для изменений, т.е. для записи и для чтения в любом месте; при этом в отличие от режима "w+"можно открыть существующий файл и не уничтожать его содержимое; в отличие от режима "r+" в режиме "a+" можно вести запись в конец файла, то есть увеличивать его размеры.
Используемые коды являются строками, а не символьными константами.
Некоторые системы предоставляют еще дополнительные возможности, которые мы здесь не будем рассматривать. Используемые коды являются строками, а не символьными константами. При применении "r" открывается существующий файл. При двух других применениях тоже будет открываться существующий файл, но если такого файла нет, он будет создан. Если вы используете "w" для существующего файла, то старая версия его стирается, и ваша программа начинает записывать на чистое место. Третий параметр является указателем на файл. Это значение возвращается самой функцией:
FILE *in;
in=fopen("File","r");
Теперь in является указателем на файл "File". С этого момента программа ссылается на файл при помощи указателя in, а не по имени File. (Файл stdio.h содержит строку
FILE *fopen( )
Если fopen( ) не способна открыть требуемый файл, она возвращает значение NULL, определенное в stdio.h как 0.
^
Закрытие файла: fclose( )
В нашем примере показано, как нужно закрывать файл:
fclose(in);
Аргумент функции является указателем на файл. Для более серьезной программы нужно смотреть, успешно ли закрыт файл. Функция fclose( ) возвращает значение 0, если файл закрыт успешно, и -1 в противном случае.
^
Текстовые файлы с буферизацией
Функции fopen( ) и fclose( ) работают с текстовыми файлами с "буферизацией". Под буферизацией мы понимаем, что вводимые и выводимые данные запоминаются во временной области памяти, называемой буфером. Если буфер заполнился, содержимое его передается в блок, и процесс буферизации начинается снова. Одна из основных задач fclose( ) заключается в том, чтобы освободить любые частично заполненные буфера, если файл закрыт. Текстовым считается файл, в котором информация запоминается в виде символов в коде ASCII или аналогичном. Текстовый файл отличается от двоичного файла, который обычно используется для запоминания кодов машинного языка.
^
Ввод-вывод текстового файла: getc( ), putc( )
Две функции getc( ) и putc( ) работают аналогично функциям getchar( ) и putchar( ) (описанным в предыдущих лекциях). Разница заключается в том, что вы должны сообщить, какой файл следует использовать.
char ch;
ch=getchar( );
предназначена для получения символа от стандартного ввода, а
ch=getc(in);
- для получения символа от файла, на который указывает in.
putchar(ch);
выводит символ на стандартный файл вывода.
putc(ch,t);
предназначена для записи символа ch в файл, на который ссылается указатель t типа FILE.
^
Ввод-вывод файла: fprintf( ), fscanf( ), fgets( ), fputs( )
Все функции ввода-вывода, которые мы использовали в предыдущих лекциях, имеют аналоги для ввода-вывода файла. Основное отличие состоит в том, что нам нужно использовать указатель типа FILE , чтобы сообщить функциям с каким файлом им следует работать. Подобно getc( ) и putc( ) эти функции используются после функции fopen( ), открывающей файл, и перед fclose( ), закрывающей его.
^
Функции fprintf( ) и fscanf( )
Эти функции ввода-вывода работают почти как printf( ) и scanf( ) (см. лекцию 4), но им нужен дополнительный аргумент для ссылки на сам файл. Он является первым в списке аргументов. Пример, иллюстрирующий обращение к этим функциям:
#include
main( )
{
FILE *fi;
int age;
fi=fopen("File","r"); /* считывание*/
fscanf(fi,"%d",&age); /* fi указывает на File */
fclose(fi);
fi=fopen("Data", "a"); /*дополнение*/
fprintf(fi,"Data is %d.\n",age);
/*fi указывает на Data*/
fclose(fi);
}
В отличие от getc( ) и putc( ) эти функции получают указатель типа FILE в качестве первого аргумента.
^
Функция fgets( )
Эта функция имеет три аргумента, в то время как gets( ) имеет лишь один. Пример ее использования:
/* Программа считывает файл строка за строкой */
#include
#define MAX 80
main( )
{
FILE *f1;
char *string[MAX]
f1=fopen("File","r");
while (fgets(string,MAX,f1) != NULL)
puts(string);
}
Мы расположили вводимую информацию в символьном массиве string. Первый из трех аргументов функции fgets( ) является указателем на местоположение считываемой строки. Второй аргумент содержит предельную длину считываемой строки. Функция прекращает работу после считывания символа новой строки или после считывания символов общим числом MAX-1, в зависимости от того, что произойдет раньше. В любом случае нуль-символ '\0' добавляется в самый конец строки. Третий аргумент указывает на файл, который будет читаться. Разница между gets( ) и fgets( ) заключается в том, что gets( ) заменяет символ новой строки на '\0', в то время как fgets( ) сохраняет символ новой строки. Подобно gets( ) функция fgets( ) возвращает значение NULL, если встречает символ EOF . Это позволяет нам проверить, достигли ли мы конца файла.
^
Функция fputs( )
Эта функция похожа на функцию puts( ). Оператор
l=fputs("Строка", fi);
Код | Положение в файле |
0 | начало файла |
1 | текущая позиция |
2 | конец файла |
Передает строку "Строка" в файл, на который ссылается указатель fi типа FILE. Конечно, сначала нужно открыть файл при помощи функции fopen( ).
l является целым числом, которое устанавливается в EOF, если fputs( ) встречает EOF или ошибку. Эта функция не ставит завершающий символ '\0' в конце копируемой строки. В отличии puts функция fputs( ) не добавляет символ новой строки в ее вывод.
^
Функция fseek( )
Функция fseek( ) позволяет нам обрабатывать файл подобно массиву и непосредственно достигать любого определенного байта в файле, открытом функцией fopen( ). fseek( ) имеет три аргумента и возвращает значение типа int.
Покажем на примере работу fseek( ):
/* использование fseek( ) для печати содержимого файла */
#include
main(number,names)
int number; char *names[ ];
{
FILE *fp; long set = 0L;
if(number<2)
puts("Введите имя файла в качестве аргумента.");
else {
if ((fp=fopen(names[1],"r")) == 0)
printf("Нельзя открыть %s\n",names[1]);
else {
while(fseek(fp, set++,0) ==0)
putchar(getc(fp));
fclose(fp);
}
}
}
Первый из трех аргументов функции fseek( ) является указателем типа FILE на файл, в котором ведется поиск. Файл следует открыть, используя функцию fopen( ). Второй аргумент "set" . Этот аргумент сообщает, как далеко следует передвинуться от начальной точки (см. ниже). Он должен иметь значение типа long, которое может быть положительным (движение вперед) или отрицательным (движение назад). Третий аргумент является кодом, определяющим начальную точку.
Функция fseek( ) возвращает 0, если все хорошо, и -1, если есть ошибка. Поскольку переменная set инициализирована нулем, при первом прохождении через цикл
while(fseek(fp,set++,0)==0)
putchar(getc(fp));
мы имеем выражение
fseek(fp,OL,0);
означающее, что мы идем в файл, на который ссылается указатель fp, и находим байт, отстоящий на 0 байт от начала, т.е. первый байт. Затем функция putchar( ) печатает содержимое этого байта. При следующем прохождении через цикл переменная set увеличивается до 1L, и печатается следующий байт. То есть, переменная set действует подобно индексу для элементов файла. Процесс продолжается до тех пор, пока set не попытается попасть в fseek( ) после конца файла. В этом случае fseek( ) возвращает значение -1 и цикл прекращается.