Программирование >>  Динамические структуры данных 

1 ... 13 14 15 [ 16 ] 17 18 19 ... 38


for ( j - n: n - i + 1:

if ( buf[i] - i++:

fin.closeO: cout endl: return 0:

j <- i: j++) cout bufCj]:

buf[i]

! ) n - 1 + 1:

Для определения длины файла используются методы seekg и tel Ig класса i f stream. С любым файлом при его открытии связывается так называемая текущая позиция чтения или записи. Когда файл открывается для чтения, эта позиция устанавливается на начало файла. Для определения длины файла мы перемещаем ее на конец файла с помощью метода seekg (оператор 1), а затем с помощью tel Ig получаем ее значение, запомнив его в переменной len (оператор 2).

Метод seekg (offset. org) перемещает текущую позицию чтения из файла на offset байтов относительно org. Параметр org может принимать одно из трех значений:

i OS:: beg - от начала файла;

iOS:: cur - от текущей позиции;

i OS:: end - от конца файла.

beg. cur и end являются константами, определенными в классе i os, предке i f stream, a символы :: означают операцию доступа к этому классу.

В операторе 3 выделяется len + 1 байтов под символьную строку buf, в которой будет храниться текст из файла. Мы выделяем на один байт больше, чем длина файла, чтобы после считывания файла записать в этот байт нуль-символ.

Для чтения информации требуется снова переместить текущую позицию на начало файла (оператор 4). Собственно чтение выполняется в операторе 5 с помощью метода read( buf. 1 en), который считывает из файла 1 en символов (или менее, если конец файла встретится раньше) в символьный массив buf.

В операторе 6 определяются служебные переменные. В переменной п будет храниться позиция начала текущего предложения, переменная i используется для просмотра массива, переменная j - для вывода предложения.

Цикл просмотра массива buf (оператор 7) завершается, когда встретился нуль-символ. Если очередным символом оказался вопросительный знак (оператор 8), выполняется вывод символов, начиная с позиции п до текущей, после чего в переменную п заносится позиция начала нового предложения.

Оператор 9 (закрытие потока) в данном случае не является обязательным, так как явный вызов с1 ose() необходим только тогда, когда требуется закрыть поток раньше окончания действия его области видимости.

Если требуется вывести результаты выполнения программы не на экран, а в файл, в программе следует описать объект класса выходных потоков ofstream, а затем использовать его аналогично другим потоковым объектам, например:

ofstream fout( textout.txt ):

if (!fout) { cout Ошибка открытия файла вывода endl: return 1: } fout buf[j]:

Если требуется закрыть поток раньше окончания действия его области видимости, используется метод close:

fout.closeO:

При выполнении некоторых заданий этого семинара может потребоваться посимвольное чтение из файла. При использовании потоков оно выполняется с помощью метода get О. Например, для программы, приведенной выше, посимвольный ввод выглядит следующим образом:

whileCCbufCi] - fin.getO) !- EOF) {

i++:

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

#include <stdio.h> int main(){

FILE *fin: 1

fin - fopenC text. txt . r ): III

if (Ifin) { puts( 0mH6Ka открытия файла ): return 1: }

fseekCfin. 0. SEEKJND):

long len - ftell(fin):

char *buf - new char [len + 1]:

const int l block - 1024:

int num block - len / l block:

fseekCfin. 0. SEEKJET):

fread(buf. l block. num block + 1. fin):

bufClen] - XO:

3 4

5 6 7 8

long n - 0. i - 0. j - 0: while(buf[i3) { if( buf[i] - ? ) {

for ( j n: j <= i; j++) putchar(buf[3]):

n - i 1:

if ( bufCi] =- . .buf[i] - ! ) n = i + 1; i++:



fclose(fin): printf( \n ): return 0:

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

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

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

SEEKSET - от начала файла;

SEEK CUR - от текущей позиции;

SEEKEND - от конца файла.

Чтение из файуа выполняется функцией freadCbuf. size. num. file) блоками по si ze байт. Требуется также задать количество блоков num. В программе размер блока задан в переменной 1 Ы оск равным 1024, поскольку размер кластера кратен степени двойки. В общем случае чем более длинными блоками мы читаем информацию, тем быстрее будет выполнен ввод. Для того чтобы обеспечить чтение всего файла, к количеству блоков добавляется 1 для округления после деления. Вывод на экран выполняется посимвольно с помощью функции putchar. Если требуется с помощью функций библиотеки вывести результаты выполнения программы не на экран, а в файл, в программе следует описать указатель на структуру FILE, с помощью функции fopen открыть файл для записи (второй параметр функции - w), а затем использовать этот указатель в соответствующих функциях вывода, например:

FILE *fout:

fout - fopen( textout.txt . w ):

if (Ifout) { puts( 0uM6Ka открытия файла вывода ): return 1: }

putc(bufU]. fout): или 5)utc(buf[j]. fout): После окончания вывода файл закрывается с помощью функции fclose: fclose(fout):

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

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

1. Длина динамической строки может быть переменной. Динамические строки нельзя инициализировать при создании.

2. Длина нединамической строки должна быть константным выражением.

3. При задании длины строки необходимо учитывать завершающий нуль-символ.

4. Присваивание строк выполняется с помощью функций библиотеки.

5. Для консольного ввода-вывода строк используются либо объекты cin и Cout. либо функции библиотеки gets, scanf и puts, printf.

6. Ввод-вывод из файла может выполняться с помощью либо объектов классов ifstream и of stream, либо функций библиотеки fgets, f scanf и fputs, fprintf.

7. Ввод строки с помощью операции выполняется до первого пробельного символа. Для ввода строки, содержащей пробелы, можно использовать либо методы getl ine или get класса i stream, либо функции библиотеки gets и scanf.

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

9. Посимвольное чтение из файла неэффективно.

10. Разбивайте написание программы на последовательность шагов.

11. Выход за границы строки и отсутствие нуль-символа являются распространенными причинами ошибок в программах.

12. Средства, предоставляемые языком, влияют на алгоритм решения задачи, и поэтому перед тем, как продумывать алгоритм, необходимо эти средства изучить.

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

14. Недостатком С-строк по сравнению с классом stri ng является отсутствие проверки выхода строки за пределы отведенной ей памяти.

Задания Вариант 1

Написать программу, которая считывает из текстового файла три предложения и выводит их в обратном порядке.

Вариант 2

Написать программу, которая считывает текст из файла и выводит на экран только предложения, содержащие введенное с клавиатуры слово.

Задания на строки, приведенные в Учебнике на с. 159. рассчитаны на использование функций позиционирования курсора на 3iq>aHe и управления цветом символа и фона. Эти функции не поддерживаются стандартом, но входят в состав большинства старых оболочек, например Borland С++ 3.1 или Microsoft Quick С.



Вариант 3

Написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа.

Вариант 4

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

Вариант 5

Написать программу, которая считывает текст из файла и выводит его на экран, меняя местами каждые два соседних слова.

Вариант 6

Написать программу, которая считывает текст из файла и выводит на экран только предложения, не содержащие запятых.

Вариант 7

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

Вариант 8

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

Вариант 9

Написать программу, которая считывает текст из файла и выводит на экран только предложения, состоящие из заданного количества слов.

Вариант 10

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

Вариант 11

Написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел.

Вариант 12

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

Вариант 13

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

Вариант 14

Написать программу, которая считывает текст из файла и выводит его на экран, заменив цифры от О до 9 на слова ноль , один , девять , начиная каждое предложение с новой строки.

Вариант 15

Написать программу, которая считывает текст из файла, находит самое длинное слово и определяет, сколько раз оно встретилось в тексте.

Вариант 16

Написать программу, которая считывает текст из файла и выводит на экран сначала вопросительные, а затем восклицательные предложения.

Вариант 17

Написать программу, которая считывает текст из файла и выводит его на экран, после каждого предложения добавляя, сколько раз встретилось в нем введенное с клавиатуры слово.

Вариант 18

Написать программу, которая считывает текст из файла и выводит на экран все его предложения в обратном порядке.

Вариант 19

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

Вариант 20

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



1 ... 13 14 15 [ 16 ] 17 18 19 ... 38

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика