Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 8.4






 

#include < stdio.h>

int main()

{

FILE *ffseek (finin;

fin = fopen(" text.txt", " r");

setlocale(LC_ALL, " Russian");

if (! fin)

{

puts(" Ошибка открытия файла");

return 1;

}

 

fseek(fin. 0. SEEK END);

long len = ftell(fin);

char *buf = new char[len + 1];

 

const int l block = 1024;

int num block = len/l block;

fseek(fin. 0. SEEK SET);

fread(buf. l block, num block + 1. fin);

buf[len] = '\0';

 

long n = 0, i = 0, j = 0;

while(buf[i])

{

if (buf[i] == '? ')

{

for (j = n; j < = i; j++)

putchar(buf[j]);

n = i + j;

}

}

fclose(fin);

printf('\n");

 

return 0;

}

 

В операторе 1 определяется указатель на описанную в заголовочном файле < stdio.h> структуру FILE. Указатель именно такого типа формирует функция от­крытия файла fopen. Ее вторым параметром задается режим открытия файла. В данном случае файл открывается для чтения (г).

Файл можно открыть в двоичном (Ь) или текстовом (t) режиме. Эти символы записывают во втором параметре, например, " rb" или " rt". Двоичный режим озна­чает, что символы перевода строки и возврата каретки (0x13 и 0x10) обрабатыва­ются точно так же, как и остальные. В текстовом режиме эти символы преобразу­ются в одиночный символ перевода строки. По умолчанию файлы открываются в текстовом режиме.

Для позиционирования указателя текущей позиции используется функция f seek с параметрами, аналогичными соответствующему методу потока (операторы 3 и 7). Константы, задающие точку отсчета смещения, описаны в заголовочном файле < stdiо. h> и имеют имена:

SEEK_SET - от начала файла; SEEK_CUR - от текущей позиции; SEEK_END - от конца файла.

Чтение из файла выполняется функцией fread(buf, size, num. file) блоками по size байт. Требуется также задать количество блоков num. В программе размер бло­ка задан в переменной равным 1024, поскольку размер кластера кратен сте­пени двойки. В общем случае чем более длинными блоками мы читаем информа­цию, тем быстрее будет выполнен ввод. Для того чтобы обеспечить чтение всего файла, к количеству блоков добавляется 1 для округления после деления.

Вывод на экран выполняется посимвольно с помощью функции putchar.

Если требуется с помощью функций библиотеки вывести результаты выполнения программы не на экран, а в файл, в программе следует описать указатель на струк­туру FILE, с помощью функции fopen открыть файл для записи (второй параметр функции - w), а затем использовать этот указатель в соответствующих функциях вывода, например:

 

FILE *fout;

fout = fopen(textout.txt". " w");

setlocale(LC_ALL, " Russian");

if (Ifout)

{

puts(" Ошибка открытия файла вывода");

return 1;

}

putc(buf[j], fout); // или fputc(buf[j], fout);

 

После окончания вывода файл закрывается с помощью функции fclose:

 

fclose(fout);

 

Смешивать в одной программе ввод-вывод с помощью потоковых классов и с по­мощью функций библиотеки не рекомендуется.

В целом программа, написанная с использованием функций библиотеки, может получиться более быстродействующей, но менее безопасной, поскольку програм­мист должен сам заботиться о большем количестве деталей.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.005 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал