Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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);
Смешивать в одной программе ввод-вывод с помощью потоковых классов и с помощью функций библиотеки не рекомендуется. В целом программа, написанная с использованием функций библиотеки, может получиться более быстродействующей, но менее безопасной, поскольку программист должен сам заботиться о большем количестве деталей.
|