Работающих с потоковыми файлами

Пример 4.10.3-1. Дан текстовый файл, каждая строка которого содержит только слова из русских букв, разделенных одним или несколькими пробелами. Разработать программный код трех процедур:

· процедуры-функции с необходимыми формальными параметрами, которая получает строку и переставляет ее символы в обратном порядке;

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

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

 

Форма разрабатываемого приложения представлена на рис. 4.10.3-1.

На первом этапе необходимо создать процедуру-функцию Perevorot(), которая, получив через параметр строку s, с помощью регулярного цикла с отрицательным шагом записывает в новую строку temp все символы исходной строки s и возвращает созданную строку temp в качестве результата.

На втором этапе необходимо создать процедуру-подпрограмму Resh(), которой через параметры передаются две строки, с именами исходного и нового файлов. В Resh() необходимо создать два потоковых объекта: Rf – типа StreamReader, служащий для чтения исходного файла, и wf – типа StreamWriter, необходимый для записи в новый файл.

 

 

Рис. 4.10.3-1. Форма проекта Пример 10.3-1

 

Так как запись в новый файл должна производиться построчно, то второй параметр потока wf должен быть равным True, который означает, что при каждом использовании метода WriteLine() будет производиться добавление строки в существующий файл.

Далее в цикле считывается очередная строка исходного файла, и из нее с помощью процедуры DelProb() удаляются лишние пробелы и создается массив слов Mas(). Затем во внутреннем цикле каждое слово из массива Mas() переворачивается наоборот с использованием функции Perevorot().

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

Программный код приложения представлен на рис. 4.10.3-2.


 

'Дан текстовый файл. 'Слова в строках файла разделены одним или несколькими пробелами. 'В каждой строке файла перевернуть слова наоборот и 'записать в новый текстовый файл через один пробел 'Потоковый способ построчно Option Strict On Option Explicit On Imports System.IO Public Class Form1 'функция переворачивает строку наоборот Function Perevorot(ByVal s As String) As String Dim temp As String = "" Dim L As Integer = s.Length For i As Integer = L - 1 To 0 Step -1 temp = temp + s.Substring(i, 1) Next Return temp End Function 'процедура удаления из строки лишних пробелов 'чтобы слова разделялись только одним пробелом Sub DelProb(ByRef s As String) s = s.Trim Do While s.IndexOf(Space(2)) >= 0 s = s.Replace(Space(2), Space(1)) Loop End Sub Sub Resh(ByVal filename1 As String, _ ByVal filename2 As String,_ ByRef Lb1 As ListBox, ByRef Lb2 As ListBox) 'создание потока для чтения из исходного текстового файла Dim Rf As New StreamReader(filename1) 'создание потока для записи в другой текстовый файл 'Значение True 2-го параметра означает, что будет 'производиться дозапись в конец файла Dim wf As New StreamWriter(filename2, True) Dim line1, line2, slovo As String Dim Mas() As String Try Do While Not Rf.EndOfStream() 'пока не достигнут конец потока line1 = Rf.ReadLine() 'чтение строки из 1 файла в line1 Lb1.Items.Add(line1) 'вывод прочитанной строки line1 в ListBox DelProb(line1) 'удаление из строки line1 лишних пробелов Mas = Split(line1, " ") 'разбиваем строку line1 на массив слов line2 = ""'новая строка для записи в другой файл For i As Integer = 0 To Mas.Length - 1 slovo = Mas(i)'один элемент массива - это слово 'перевернули слово и снова записали в массив Mas(i) = Perevorot(slovo) Next 'склеили массив перевернутых слов в строку line2, 'разделив слова одним пробелом line2 = Join(Mas, " ") wf.WriteLine(line2)'запись строки line2 во 2 файл Lb2.Items.Add(line2)'вывод строки line2 в ListBox Loop Catch ex As Exception MsgBox("Невозможно прочитать данные из файла") Finally wf.Flush()'очистка буфера потока Rf.Close()'закрытие потока wf.Close() End Try End Sub Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim filename1 As String = "", filename2 As String = "" filename1 = TextBox1.Text filename2 = TextBox2.Text Resh(filename1, filename2, ListBox1, ListBox2) End Sub Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) End End Sub End Class

 

Рис. 4.10.3-2. Программный код проектаПример 10

 

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

· процедуры-функции Perevorot() с необходимыми параметрами, которая получает строку и переставляет ее символы в обратном порядке;

· процедуры-подпрограммы Reshenie(), с необходимыми параметрами, которая считывает текст из файла с помощью объекта My.Computer.FileSystem, и для каждой строки исходного файла переворачивает каждое слово наоборот с использованием процедуры-функции и записывает в новую строку через один пробел по отдельности перевернутые слова исходной строки;

· процедуры vivodFile() с необходимыми параметрами, которая полученный в п.2, результат с помощью предыдущей процедуры записывает в новый файл;

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

 

Программный код проекта представлен на рис. 4.10.3-3

Первое задание реализует процедура-функция Perevorot(), которая, получив через формальный параметр по значению строку s, с помощью регулярного цикла с отрицательным шагом записывает в новую строку temp все символы исходной строки s и возвращает созданную строку temp в качестве результата.

Второе задание реализует процедура Reshenie(), которой через формальные параметры передается строка filename, содержащая имя исходного файла, и по ссылке возвращаются строка s1с исходным файлом и строка s2 с перевернутыми словами, которую надо будет записать в новый файл. В ней сначала с помощью объектаMy.Computer.FileSystem весь исходный файл считывается целиком в одну строку s1, затем полученная строка с помощью метода Split() разбивается на массив строк Stroki() по признаку конца строки (vbNewLine). Далее во внешнем цикле из каждой строки исходного файла с помощью процедуры DelProb()удаляются лишние пробелы, и строка разбивается на массив слов slova() по признаку одного пробела. Во внутреннем цикле каждое слово переворачивается наоборот с использованием процедуры-функции Perevorot()и записывается в новую строку s2 через один пробел. После завершения внутреннего цикла в новую строку s2 добавляется признак конца строки (vbNewLine) для разделения строк в новом файле, и далее повторение внешнего цикла для обработки очередной строки исходного файла.

Третье задание реализует процедура vivodFile(), которой через параметры передается строка filename, содержащая имя нового файла, и строка Sс перевернутыми словами для записи в новый файл.

 

Option Strict On Option Explicit On Public Class Form1 'функция переворачивает строку наоборот Function Perevorot(ByVal s As String) As String Dim temp As String = "" Dim L As Integer = s.Length For i As Integer = L - 1 To 0 Step -1 temp = temp + s.Substring(i, 1) Next Return temp End Function 'процедура удаления из строки лишних пробелов 'чтобы слова разделялись только одним пробелом Sub DelProb(ByRef s As String) s = s.Trim Do While s.IndexOf(Space(2)) >= 0 s = s.Replace(Space(2), Space(1)) Loop End Sub 'Процедура чтения данных из текстового файла целиком в строку 's1 и формирования новой строки s2 для записи в новый файл Sub Reshenie(ByVal filename As String, ByRef s1 As String, _ ByRef s2 As String) Dim line, OdnoSlovo As String Dim Stroki() As String'массив строк исходного файла Dim slova() As String'массив слов одной строки исх.файла s2 = ""'новая строка с перевернутым файлом 'Открытие существующего файла и загрузка его текстовое 'содержимое целиком в одну строку s1 Try s1 = My.Computer.FileSystem.ReadAllText(filename) Stroki = s1.Split(CChar(vbNewLine)) 'массив строк исходного файла For i As Integer = 0 To Stroki.Length - 1 line = Stroki(i)'одна строка исходного файла DelProb(line)'удалили лишние пробелы slova = line.Split(CChar(" ")) 'разбили ее на массив слов For j As Integer = 0 To slova.Length - 1 OdnoSlovo = Perevorot(slova(j)) s2 = s2 + OdnoSlovo + " " Next s2 = s2 + vbNewLine Next Catch ex As Exception MsgBox("Файл не может быть открыт из-за " & _ " следующей ошибки:" & vbNewLine & vbCrLf & _ ex.Message) End Try End Sub 'Процедура записи строки в текстовый файл Sub vivodFile(ByVal filename As String, ByVal S As String) 'Запись строки-результата S в текстовый файл (False) Try My.Computer.FileSystem.WriteAllText(filename, S, False) Catch ex As Exception MsgBox("ошибка при сохранении (создании) файла") MsgBox("Данные в файл не могут быть переписаны из-за" _ & " следующей ошибки:" & vbNewLine & ex.Message) End Try End Sub Private Sub Button1_Click(...) Dim filename1, filename2 As String Dim OldStr, NewStr As String filename1 = TextBox1.Text filename2 = TextBox2.Text Reshenie(filename1, OldStr, NewStr) vivodFile(filename2, NewStr) TextBox3.Text = OldStr TextBox4.Text = NewStr End Sub End Class

 

Рис. 4.10.3-3. Программный код проекта Пример 10

 


Тестовые задания

 

1. Файл – это

1) поименованная совокупность данных, размещенных на ВЗУ и хранимая, пересылаемая и обрабатываемая как единое целое

2) поименованная совокупность данных, размещенных в памяти компьютера и хранимая, пересылаемая и обрабатываемая как единое целое

3) совокупность данных, размещенных на ВЗУ и хранимая, пересылаемая и обрабатываемая как единое целое

4) поименованная совокупность данных, размещенных на ВЗУ

2. Каталог файла – это

1) оглавление файла

2) директория файла

3) папка файла

4) нет правильного ответа

3. Текстовые файлы – это

1) последовательные файлы, состоящие из записей переменной длины и расположенные на внешнем носителе

2) файлы произвольного доступа, состоящие из записей переменной длины и расположенные на внешнем носителе

3) последовательные файлы, состоящие из записей постоянной длины и расположенные на внешнем носителе

4) последовательные файлы, состоящие из записей переменной длины и расположенные в памяти компьютера

4. Работа с файлом состоит из этапов

1) открытия, чтения или записи информации, закрытия

2) открытия, записи информации, закрытия

3) открытия, чтения, закрытия

4) открытия, , закрытия

5) нет правильного ответа

5. В Vb возможны следующие способа доступа к текстовым файлам

1) с использованием методов класса System.IO

2) с использованием объекта My.Comhuter.System

3) с использованием потоков

4) нет правильного ответа

6. Метод ReadLine( )

1) требует предварительного создания потока

2) не требует предварительного создания потока

3) требует предварительного открытия файла с помощью дескриптора

4) требует указания пути к текстовому файлу


 

7. Метод ReadToEndLine( )

1) требует предварительного создания потока

2) не требует предварительного создания потока

3) требует предварительного открытия файла с помощью дескриптора

8. Чтобы добавить строку в существующий файл, можно использовать оператор

1) Dim t As New StreamWriter("f[le1.txt", True)

2) Dim t As New StreamWriter("f[le1.txt", False)

3) Dim t As StreamWriter("f[le1.txt")

4) все ответы верны

9. Метод ReadAllText( ) применяется

1) только при работе с объектом My.Computer.FileSystem

2) при работе с потоковым вводом-выводом

3) при работе с дескриптором

10. Метод WriteAllText( )

1) может добавить данные в конец существующего файла или полностью перезаписать весь файл

2) можно только добавить данные в конец существующего файла

3) можно вывести все данные из файла на экран монитора

11. Ошибочной записью оператора является

1) StreamWriter.WriteAllText("Hello")

2) My.Computer.FileSystem.WriteAllText("file1.txt","Hello", False)

3) My.Computer.FileSystem.WriteAllText("file1.txt", "Hello", True)

4) нет верного ответа

12. Метод WriteAllText( )

1) имеет 3 аргумента

2) имеет 2 аргумента

3) имеет 1 аргумента

4) может иметь 1, 2 или 3 аргумента

5) нет верного ответа

13. Метод ReadAllText( )

1) имеет 3 аргумента

2) имеет 2 аргумента

3) имеет 1 аргумента

4) может иметь 1, 2 или 3 аргумента

5) нет верного ответа

14. Метод ReadToEnd( )считывает из файла

1) всю информацию (все строки символов файла) *

2) очередной символ или null, если больше символов нет

3) только одну строку

4) код символа или 0, если больше символов нет


 

15. Метод ReadLine( )считывает из файла

1) всю информацию (все строки символов файла)

2) очередной символ или null, если больше символов нет

3) только одну строку символов*

4) код символа или 0, если больше символов нет

16. При достижении конца символьного потока метод ReadLine() вернет значение

1) -1

2) 0

3) null

4) EndOfStream

17. Метод Length при обращении к потоку FileStream определит количество:

1) бит в потоке

2) +: байт в потоке

3) значений некоторого типа в потоке.

18. Если файл с именем filename.txt не существует, то при попытке выполнить следующую процедуру

Sub readfile1(ByVal filename As String, ByRef p As String) Dim Rf As StreamReader Rf = New StreamReader(filename) Try p = Rf.ReadToEnd() : Rf.close() Catch ex As Exception MsgBox("Невозможно прочитать данные из файла") End Try End Sub

1) открывается файл с именем filename.txt и читаются все данные

2) появляется окно каталогов, в котором пользователь должен найти данный файл

3) генерируется исключение FileNotFoundException

4) генерируется исключение IOException


 

19. В результате выполнения процедуры

Sub writefile1(ByVal filename As String, ByVal p As String) If File.Exists(filename)Then MsgBox("Файл " & filename & " уже существует") Exit Sub End If Dim wf As New StreamWriter(filename) wf.WriteLine(p): wf.Close() 'закрытие потока End Sub

1) создается, открывается файл с именем filename.txt и происходит запись всей строки*

2) появляется окно каталогов, в котором пользователь должен найти данный файл

3) генерируется исключение FileNotFoundException

4) генерируется исключение IOException

5) открывается файл filename.txt и происходит запись всей cтроки

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

Sub writefile1(ByVal filename As String, ByVal p As String) If File.Exists(filename)Then MsgBox("Файл " & filename & " уже существует") Exit Sub End If Dim wf As StreamWriter= File.CreateText(filename) wf.WriteLine(p) : wf.Close() End Sub

1) создается, открывается файл filename.txt и происходит запись всей строки

2) появляется окно каталогов, в котором пользователь должен найти данный файл

3) генерируется исключение FileNotFoundException

4) генерируется исключение IOException

5) выводится сообщение, что файл уже существует*


21.

4.10.7. Лабораторная работа по теме «Создания приложений, работающие с потоковыми файлами»

 

Цель работы: овладение практическими навыками разработки и программирования вычислительного процесса, связанного с созданием текстовых файлов, обработкой, внесенной в них информации, получение дальнейших навыков по отладке и тестированию программ

 

Вопросы, подлежащие изучению

 

1)Понятие файла. Особенности работы с текстовыми файлами.

2)Основные операторы VB для работы с текстовыми файлами.

3)Средства обработчика ошибок времени исполнения.

4)Классы и объекты VB для работы с текстовыми файлами.

5) Использование классов StreamReader, StreamWriter и объекта My.Computer.FileSystem для работы с текстовыми файлами.

 

Общее задание на разработку проекта

 

1) Изучите вопросы создания приложений, работающие с потоковыми файлами (Тема 10).

2)Создайте приложение с именем Проект-10.

3) Выберите вариант задания из таблицы по усмотрению преподавателя.

4) Создайте с помощью стандартной программы Microsoft Windows «Блокнот» текстовый файл из 5-7 строк с исходными данными, соответствующими варианту задания.

5) Разработайте интерфейс пользователя, предусмотрев в нем несколько кнопок: для ввода данных из текстового файла, для обработки данных, для вывода результата в текстовый файл.

6) Напишите программный код процедуры пользователя для обработки текстового файла, которая должна вызывать процедуру обработки заданной строки (см. вариант задания лабораторной работы № 9), а также процедур для чтения и записи данных в/из текстового файла. Обмен данными между пользовательскими процедурами должен осуществляться через параметры, без глобальных переменных.

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

8) Допишите программный код проекта, в котором событийные процедуры должны содержать только операторы вызова пользовательских процедур.

9) Выполните приложение и получите результат.

10) Докажите правильность результата.

Варианты индивидуальных заданий

 

1) В текстовом файле найти строку, содержащую наибольшее количество цифр, идущих подряд.
2) Зашифровать каждую строку текстового файла, содержащего русские буквы, пробелы и знаки препинания: заменить каждую букву, непосредственно следующей за ней по алфавиту ("я" на "а"), строчную букву преобразовать в прописную, прописную - в строчную.
3) В текстовом файле найти строку, содержащую наибольшее количество слов, начинающихся и заканчивающихся на одну и ту же букву
4) В текстовом файле найти строки, в которых не было ни одной замены каждого третьего слова «мама» на слово «мамочка».
5) Из каждой строки текстового файла удалить все символы, входящие в нее более одного раза и найти самую короткую строку - результат.
6) Преобразовать каждую строку текстового файла, повторив в ней каждый символ, совпадающий с заданным и найти самую длинную строку - результат.
7) Записать в новый файл те строки исходного текстового файла, из символов которых можно составить вашу фамилию.
8) В каждой строке текстового файла определить максимальную длину подстроки, состоящей из заданного символа и найти их сумму.
9) Исключить из каждой строки текстового файла группы символов, расположенных между круглыми скобками, включая сами скобки. Предполагается, что внутри каждой пары скобок нет других скобок. Найти самую длинную строку – результат.
10) В текстовом файле найти строку, содержащую наименьшее количество слов четной длины, в которых нет буквы «а».
11) Записать в новый файл те строки исходного текстового файла, в которых нет ни одного слова, содержащего ровно три буквы «а».
12) В каждой строке текстового файла определить самое длинное слово нечетной длины и записать их в новый файл.
13) В текстовом файле найти строку, содержащую самое короткое слово четной длины.
14) Каждая строка текстового файла содержит дату в формате "mm-dd-yyyy", где mm - месяц, dd - день, yyyy - год. Записать в новый файл только те строки исходного текстового файла, которые содержат корректно заданные даты, изменив их формат на "dd.mm.yy", где yy - две последние цифры года.
15) Из каждой строке текстового файла, не содержащей цифр, получить "сжатую" строку, заменив самую длинную подстроку вида "XXX…XX" на подстроку вида "nX", где X - повторяющийся символ, n - число его повторений и записать в новый файл только измененные строки.
16) Записать в новый файл те строки исходного текстового файла, которые нельзя преобразовать в число.
17) Из каждой строки текстового файла получить новую строку, записывая каждый символ исходной строки только один раз.
18) В каждой строке текстового файла подсчитать сумму цифр и найти строку с наименьшей суммой.
19) В текстовом файле, не содержащем букв русского алфавита, найти строку с максимальным процентом гласных букв (a, e, i, o, u, y).
20) Записать в новый файл те строки исходного текстового файла, в которых самое длинное слово встречается раньше, чем самое короткое слово.
21) Преобразовать каждую строку текстового файла, удалив из каждого слова нечетной длины средний символ, и найти строку с минимальным количеством удалений.
22) В текстовом файле найти строку, содержащую наибольшее количество симметричных слов, т.е. читающихся одинаково слева направо и справа налево.
23) Записать в новый файл те строки исходного текстового файла, которые являются записью вещественного числа с нулевой дробной частью.
24) Для каждой строки текстового файла, содержащей корректно заданную дату в формате "dd.mm.yy", где dd - день, mm - месяц, yy - год, получить строку с датой, отстоящей от заданной на n дней вперед, в том же формате и записать в новый файл.
25) Записать в новый файл те строки исходного текстового файла, символы которых расположены в алфавитном порядке.
26) Записать в новый файл те строки исходного текстового файла, которые являются записью целого числа.
27) Записать в новый файл те строки исходного текстового файла, в которых нет n-ого с конца вхождения заданного символа.
28) Преобразовать каждую строку текстового файла, состоящую из "слов" длиной менее 10 символов и разделенных запятыми, заменив запятые группами пробелов так, чтобы каждое слово начиналось с позиции 10*(k - 1) + 1, где k - номер "слова".
Преобразовать каждую строку текстового файла, вставив в середину каждого слова четной длины букву «К» и найти строку с максимальным количеством вставок.
30) Для каждой строки текстового файла, содержащей корректно заданную дату в формате "dd.mm.yy", где dd - день, mm - месяц, yy - год, получить строку с датой, отстоящей от заданной на n дней назад, в том же формате и записать в новый файл.

 

 

4.10.7.4. Содержание отчёта

 

1)Тема и название лабораторной работы;

2)Фамилия, имя студента, номер группы, номер варианта.

3)Задание на разработку проекта.

4)Формализация и уточнение задания.

5)Элементы, разрабатываемого проекта:

5.1) графический интерфейс пользователя;

5.2) таблица свойств объектов;

5.3) схема алгоритма решаемой задачи;

5.4) программный код проекта.

6)Результаты выполнения проектов.

7)Доказательство правильности работы программы.