Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 1.docx
Скачиваний:
11
Добавлен:
26.09.2019
Размер:
364.88 Кб
Скачать

Курсор.

Ввод-вывод очередного символа (или блока символов) происходит из позиции, где сейчас находится так называемый курсор. Курсор – это некоторый абстрактный указатель, показывающий текущую позицию в открытом файле, с которой работает программа. Позиция курсора (текущая позиция в файле) – это номер символа (от начала файла), с которого начнётся чтение/запись при следующем обращении к файлу

При чтении символа или блока символов курсор сдвигается на количество прочитанных символов вперёд, после чего он начинает показывать на символ, с которого начнётся чтение при следующем обращении к файлу. Аналогичные процессы происходят и при записи.

При открытии файла на чтение ("r") или запись ("w") курсор устанавливается на начало файла. При открытие файла на добавление ("a") он устанавливается на конец файла. Курсор может позиционироваться вручную (это описано ниже), но не может быть установлен раньше начала файла, или дальше текущей длины файла (хотя может быть установлен в самый конец файла).

Ввод-вывод отдельных символов и строк.

Одним из наиболее эф­фективных способов осуществления ввода-вывода одного сим­вола является использование библиотечных функций getc() и putc(). Они имеют следующие прототипы:

int getc (FILE *stream);

int putc (int c, FILE *stream); где

с – выводимый символ,

stream – поток, в который выводится символ.

Функция getc() берёт один символ из потока (файла) и возвращает его код в случае успешного заверщения. Функция putc() записывает в поток (файл) символ с заданным кодом и возвращает код этого символа в случае успешного завершения. Обе функции возвращают константу EOF в случае ошибки.

Существуют также "двойники" этих функций fgetc() и fputc(), имеющие те же самые аргументы и выполняющие те же самые действия. Различие состоит в реализации – fgetc() и fputc() реализованы как функции, а getc() и putc() - как макросы.

Для ввода-вывода строк из файла существуют следующие функции:

char *fgets( char *string, int n, FILE *stream );

int fputs( const char *string, FILE *stream ); где

string – буфер, хранящий строку для вывода или резервирующий место для ввода строки.

n – максимальное количество вводимых символов.

stream – указатель на идентификатор потока.

Функция fgets() читает из определенного указателем stream файла не более (n-1) символов и записывает их в строку, на ко­торую указывает s. Функция прекращает чтение, как только про­чтет (n-1) символов или встретит символ новой строки '\n', ко­торый переносится в строку s. Она возвращает указатель на введённую строку в случае успешного завершения или NULL в противном случае.

Функция fputs() записывает ограниченную символом '\0' строку в поток, на который указывает stream, и возвращает неотрицательное значение (обычно 0) в случае успешного завершения или значение константы EOF в случае ошибки. Символ '\0' в файл не пере­носится, и символ '\n' не записывается в конце строки вместо '\0'.

Форматированный ввод-вывод информации в файл.

Во многих случаях информацию удобно выводить в файл в форматированном виде, т.е. записывать какие-либо значения в символьном виде по заранее заданному формату. Для этого существуют функции fprintf() и fscanf(), работающие полностью аналогично функциям printf() и scanf(), но работающие с потоком ввода-вывода в файл. Функция fscanf считывает информацию из файл по заданному формату, а функция fprintf() выводит форматированную информацию в файл. Эти функции имеют следующие прототипы:

int fprintf (FILE* stream, const char* FormatString, [arg1, arg2,]…);

int fscanf(FILE* stream, const char* FormatString, [void* arg1, void* arg2,]…);

Работа этих функций полностью аналогична функциям printf() и scanf() (рассмотренным выше), но в качестве дополнительного параметра в них сообщается указтель на идентификатор потока, с которым надо обменяться данными.

Вот пример, ил­люстрирующий обращение ко всем вышеперчисленным функциям:

#include (stdio.h)

main( )

{

FILE *fi;

int age;

char ac[255];

char c;

if((fi=fopen("sam”, "r")) // Открываем на чтение

{

fscanf( fi, " %d" , &age); // Читаем информацию

c=getc(fi);

fgets(ac,254,fi);

fclose(fi);

if(fi = fopen(“data" , "a"); // Открываем на добавление

{

fprintf( fi, "sam is %d.\n" , age); // Добавляем

// информацию

putc(c,fi);

fputs(ac,fi);

fclose(fi);

}

)