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

Блочный потоковый ввод-вывод

Средсва потокового ввода-вывода позволяют пользовательской программе оперировать с блоками фиксированной длины. Для этого служат следующие функции:

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); где

buffer – буфер для хранения принимаемой или отправляемой информации.

size – размер одного блока.

count - количество блоков.

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

Функция fwrite() последовательно записывает в поток count блоков, каждый размером size байт, т.е. всего записывает count*size байт. Информация для записи берётся из области памяти, на которую указывает buffer. Аналогично, fread() читает count*size байт в область памяти, на которую указывает buffer. Обе функции возвращают количество полностью записанных/прочитанных на самом деле блоков (не байт !).

Смена текущей позиции в файле. Проверка конца файла.

Иногда возникает потребность установить позицию курсора в какое-либо конкретное место файла, например, когда необходимо прочитать какой-либо участок из середины большого файла. Смена текущей позиции в файле осуществляется с помощью функции fseek():

int fseek( FILE *stream, long offset, int origin ); где

stream – указатель на поток.

offset – смещение, на которое необходимо сместить курсор в файле.

origin – флаг, указывающий от какой позиции отсчитывать смещение:

SEEK_CUR – отсчитывать от текущей позиции курсора.

SEEK_END - отсчитывать от конца файла.

SEEK_SET - отсчитывать от начала файла.

Функция возвращает 0 в случае успешного завершения и ненулевое значение в случае ошибки.

Например:

fseek(stream, 0,SEEK_END); установит курсор на конец файла,

fseek(stream, -4, SEEK_CUR); сместит курсор на 4 символа назад.

Функция ftell() возвращает текущую позицию курсора в файле:

long ftell( FILE *stream );

Для определения конца файла можно воспользоваться возвращаемым значением функций чтения из файла – они возвращает признак ошибки (обычно это и есть символ EOF) при достижении конца файла (в большинстве случаев это и есть единственная ошибка, которая может случиться).

Другой вариант – воспользоваться функцией feof():

int feof( FILE *stream );

Эта функция по сути дела повторяет результат чтения из потока последней операции чтения. Она возвращает ненулевое значение, если последняя операция чтения пыталась прочитать символ в то время как был достигнут конец файла. Если же конец файла не был достигнут, то она возвращает 0.

Пример:

// Программа вывода символьного файла на экран дисплея

#include <stdio.h>

int main()

{

FILE *fp; // Указатель на поток

char str[255];

// Открыть файл для чтения:

if ((fp = fopen(“MyFile.txt”,"r")) = = NULL)

{

printf(“Error!”);

return 1;

}

// Цикл чтения строк из файла и вывода их на экран:

while ((fgets(str,254,fp)) != NULL)

puts(str);

fclose(fp); /* Закрыть файл */

return О;

}

Последние строки можно переписать в виде:

do

{

if(fgets(str,254,fp))

puts(str);

}

while(!feof(fp));

Функции доступа к файлам нижнего уровня.

Функции доступа к файлам нижнего уровня аналогичны функциям потокового ввода-вывода, однако в их наборе отсутствуют функции форматированного и посимвольного ввода-вывода. Операции ввода-вывода производятся только в виде поблочного доступа. Вся функциональность функций ввода-вывода нижнего уровня входит в функциональность функций потокового уровня, тем не менее, функции нижнего уровня работают несколько быстрее (что практически незаметно на современных компьютерах).

Прототипы функций нижнего уровня находятся в файле "io.h". Поскольку функции аналогичны выше описанным, то приведём лишь их краткое описание.

Открытие / закрытие сессии работы с файлом:

creat()

open()

sopen()

close()

В отличие от вышерассмотренных функций, в данном случае режим доступа (чтение, запись и т.д.) задаются не в виде строки, а в виде набора целочисленных констант, объединённых с помощью операции побитового или |. Эти константы определены в файле "io.h". Например, открытие файла в бинарном режиме для чтения выглядит так:

fh=open("file.txt",_O_BINARY | _O_RDONLY);

Функции позиционирования курсора в файле:

eof()

lseek()

tell()

Функции чтения / записи

read()

write()

commit()

Более подробно об этих функциях можно прочитать в MSDN. Отметим, что здесь приведена классическая запись имён функций ввода-вывода нижнего уровня. В среде Visual C Microsoft пропагандирует новое написание их имён – с подчёркиванием в начале (например, _open()). Именно в таком виде они и представлены в MSDN, хотя в самих программах можно использовать любую из этих форм записи.

  1. Методы сортировки данных. Сравнение производительности методов. Пример алгоритма сортировки и его программная реализация.