Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Листинг 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);

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

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





Дата публикования: 2015-10-09; Прочитано: 288 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.005 с)...