Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow Введение в программирование на языке Visual C#

Запись информации в текстовый файл

Теперь, когда дано определение понятию «поток», оговоримся, что в языке Visual C# возможно осуществить работу с потоками байтов и потоками двоичной информации, но данные темы выходят за рамки учебного пособия. Сейчас мы рассмотрим несколько примеров на запись и чтение потока символов (строк), представленных в кодировке Unicode, при этом используются классы StreamWriter и StreamReader.

Задача. Сформируйте файл, содержащий текстовую информацию о трех автомобилях, а именно: о марке, годе выпуска и цвете конкретного автомобиля.

Комментарий: для записи информации подходит объект класса

StreamWriter, обеспечивающий запись в текстовые файлы. Запись осуществляется методом WriteLine() объекта zapis. Файл создается с помощью метода CreateText(). Однако можно было бы использовать непосредственно тип StreamWriter. В листинге эта строка закомментирована.

После завершения записи в файл его нужно закрыть методом CloseO- Чтобы использовать классы StreamWriter и StreamReader, следует объявить пространство имен System.IO. В листинге 163 представлен код процедуры, отвечающий за ввод и запись информации в текстовый файл.

Листинг 163

using System.IO;

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

StreamWriter zapis = File.CreateText(@"c:Proba.txt"); //StreamWriter zapis = new

StreamWriter(@"c:Proba.txt");//непосредственно создается экземпляр класса StreamWriter

string marka,god, color; for (int i = 0; i <= 2; i++)

{

marka = Microsoft.VisualBasic.Interaction.InputBox ("Введите марку автомобиля", "Заголовок окна", -1, -1);

god =Microsoft.VisualBasic.Interaction.InputBox ("Введите год выпуска", "Заголовок окна", -1, -1);

color = Microsoft.VisualBasic.Interaction.InputBox ("Введите цвет машины", "Заголовок окна", -1, -1);

zapis.WriteLine(marka);

zapis.Write(zapis.NewLine); //Вставка новой строки

zapis.WriteLine(god); zapis.Write(zapis.NewLine); zapis.WriteLine(color);

}

zapis.Close () ;

}

}

}

Содержимое записанного файла представлено на рис. 169.

f-

f? Proba.txt - Notepad

ЕШ*

I File Edit Format View Help

Жигули

А

2009

белый

Волга

2001

черный

УАЗ

2008

красный

V

Рис. 169. Результат работы программы

Чтение информации из текстового файла

Для чтения информации из текстового файла применяется объект класса StreamReader. Чтение осуществляется методом ReadLine() объекта zapis. Этот метод считывает очередную строку файла целиком. Файл открывается с помощью метода OpenText(). Однако можно было бы использовать непосредственно тип StreamReader. В листинге эта строка закомментирована.

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

Листинг 164

private void button2_Click(object sender, EventArgs e)

{

StreamReader zapis = File.OpenText(@"c:Proba.txt");

// StreamReader zapis = new

StreamReader(@"c:Proba.txt")^/непосредственно создается экземпляр класса StreamReader

string marka, god, color; for (int i = 0; i <= 3; i + + )

{

marka = zapis.ReadLine(); god = zapis.ReadLine(); color = zapis.ReadLine();

textBoxl.AppendText(marka + " " + god + " " +

color + " ");

}

zapis.Close() ;

}

Тот же код можно написать еще проще, используя метод ReadToEnd(), с помощью которого можно прочитать всю информацию, содержащуюся в файле. Процедура представлена в листинге 165.

Листинг 165

private void button2_Click(object sender, EventArgs e)

{

StreamReader zapis = File.OpenText(@"c:Proba.txt"); string z = zapis.ReadToEnd(); textBoxl.AppendText(z + " "); zapis.Close();

}

Содержимое прочитанного файла представлено на рис. 170.

Рис. 170. Результат работы программы

И, наконец, можно считывать информацию построчно, как в листинге 164, но используя цикл с оператором while. Процедура представлена в листинге 166.

Листинг 166

private void button2_Click(object sender, EventArgs e)

{

string r;

StreamReader zapis = File.OpenText(@"c:Proba.txt"); while ((r=zapis.ReadLine()) !=null)

textBoxl.AppendText(r + " "); zapis.Close();

}

Итог работы процедуры соответствует результату, показанному на рис. 170.

Работа с файлами и каталогами

Задача 1. Пользователь вводит имя файла или директории. Разработать программу для доступа к информации о файлах и директориях, используя различные методы класса Filelnfo и класса Directorylnfo.

Комментарий: когда пользователь нажимает клавишу Enter после ввода информации в текстовое окно textBoxl, то обработчик textBoxl_KeyDown определяет, что введено: имя файла или директории? Затем на экран выводится содержимое файла с дополнительной информацией (дата и время его создания) или информация о директории (полный путь к директории и время последнего доступа).

Содержимое текстового окна определяется методом Exists класса File. Если пользователь указывает существующий файл, то вызывается метод GetFilesO, который позволяет получить файлы данного каталога в виде массива объектов. Создав экземпляр, мы можем воспользоваться его методами для получения информации о файле, например, о его имени (Name), длине (Length), дате и времени создания (CreationTime), атрибутах (Attributes).

Если код в строке if (Directory.Exists(fileName)) определяет, что указанный пользователем текст не является файлом, значит, пользователь указал существующий каталог. Вызывается метод GetDirectoriesO класса Directoryinfo для получения String-массива, содержащего имена подкаталогов в указанном каталоге. Пользователь может воспользоваться различными методами для получения информации о директориях, в частности, методами FulIName (полное имя директории), Parent (родитель), Root (корневой каталог), CreationTime (дата и время создания).

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

Листинг 167

using System.10; namespace WindowsApplicationl {

public partial class Forml : Form

{

string fileName; //имя файла или каталога public Forml()

{

InitializeComponent();

}

private void textBoxl_KeyDown(object sender, KeyEventArgs e)

{

//В качестве базового пути указываем корневой каталог Directoryinfo f = new Directoryinfo(@"C:");

//Получаем все файлы с расширением .txt Fileinfo[] textFiles = f.GetFiles("*.txt");

Directoryinfo fl = new Directorylnfо(@"C:");

//Метод GetDirectories() возвращает массив строк, представляющих все подкаталоги текущего каталога

Directorylnfо[] dir = f1.GetDirectories();

//Получаем указанный пользователем файл или каталог fileName = textBoxl.Text;

//Определение, нажал ли пользователь клавишу ENTER if (e.KeyCode == Keys.Enter)

{

//Определяем, является ли fileName файлом if (File.Exists(fileName))

{

//Отображаем содержимое файла StreamReader st = new StreamReader(fileName,

textBox2.AppendText("Дата и время создания " + f.CreationTime + " ");

textBox2.AppendText(" ");

textBox2.AppendText("Информация в файле: " +

" " + st.ReadToEnd() + " ");

st.Close();

}

//Определяем, является ли fileName каталогом else if (Directory.Exists(fileName))

{

textBox2.Clear();

textBox2.AppendText("Полный путь каталога " +

fl.FullName + " ");

textBox2.AppendText(" ");

textBox2.AppendText("Время последнего доступа + f1.LastAccessTime + " ");

}

//Сообщаем, что ни файл, ни каталог не существуют else

MessageBox.Show(textBoxl.Text + " не существует", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

}

}

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

Работа с файлами и директор... [V]fn][x"|

Веєдитє имя зайла иги директории c:vopros7.txt|

Дата и Ерем я создания С8.С3.20С4 18:55:СЗ Информация Е зайге:

Toyota

1385

Еельй

Suzuki

2007

Красньй

Рис. 171. Результаты работы программы

Задача 2. Разработайте проект, содержащий несколько форм. На первой форме разместите встроенные компоненты driveListBoxl, dirListBoxl, flleList-Boxl, которые позволят получить наглядное представление об именах дисков компьютера, о директориях указанного диска, о файлах, находящихся в директории, которую выбрал пользователь, соответственно. На второй форме следует получить фактически аналогичную информацию, но уже используя методы классов Directory, Directorylnfo, Filelnfo.

Комментарий: следует отметить, что вышеперечисленные компоненты по умолчанию недоступны в окне ToolBox, и их надо добавить самостоятельно. Для этого проделайте следующие действия: щелкните правой кнопкой мыши в

любом месте окна ТооШох, вызвав контекстно-зависимое меню. Выберите пункт Choose Items. После этого придется подождать несколько секунд, потому что в это время формируется список компонентов. Далее в окне Choose ToolBox Items следует поставить флажки напротив соответствующих компонентов и нажать кнопку Ok.

На рис. 172 показан внешний вид первой формы при запуске приложения.

Рис. 172. Вывод информации с помощью встроенных компонентов

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

Листинг 168

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Form2 f = new Form2(); this.Hide(); f.ShowDialog();

}

private void Forml_Load(object sender, EventArgs e)

{

fileListBoxl.Path = @"c:"; dirListBoxl.Path = @"c:";

}

private void driveListBoxl_Selected!ndexChanged(object sender,

EventArgs e)

{

dirListBoxl.Path = driveListBoxl.Drive[0] +

//Происходит смена диска

}

private void dirListBoxl_DoubleClick(object sender, EventArgs e)

{

fileListBoxl.Path = dirListBoxl.Path; //При изменении текущей директории становятся доступными файлы, в ней содержащиеся }

}

}

На рис. 173 показан внешний вид второй формы при запуске приложения.

Работа с файлами и каталогами

Е@Н

Имя оайла

Размер Лета и Бремя создания

А

anketa.txt

2060

26.05.2006 10:33:07

avto.txt

14.05.2006 21:26:16

avto_1 .txt

СС

14.05.2006 21:26:16

chislo.txt

V

Погньй путь

Имя директории Дата и Ерем я создания

А

c:1

і

05.03.2008 11:35:29

c:2

2

22.05.2008 17:52:24

c:BASIC

BASIC

11.12.2005 21:50:57

c:CA_LIC

CA_LIC

20.05.2009 17:30:02

V

Информация о директориях

С: D: Е:

Иноормация о дисках

Информация о зайлах

Вьход

Рис. 173. Вывод информации с помощью методов соответствующих классов

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

Листинг 169

using System.10; namespace WindowsApplicationl {

public partial class Form2 : Form

{

public Form2()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Directorylnfо directoryArray =new Directorylnfо(@"c:"); Filelnfo[] textFiles = directoryArray.GetFiles("*.txt");

foreach (Fileinfo f in textFiles)

{

textBoxl.AppendText(" "); textBoxl.AppendText(f.Name + " "); textBoxl.AppendText(" "); textBoxl.AppendText(f.Length + " "); textBoxl.AppendText(f.CreationTime + " ");

}

}

private void button2_Click(object sender, EventArgs e)

{

Directorylnfо dirArray =new Directorylnfо(@"c:"); Directorylnfо[] dir = dirArray.GetDirectories(); foreach (Directorylnfо fl in dir)

{

textBox2.AppendText(" ");

textBox2.AppendText(fl.FullName + " ");

textBox2.AppendText(" ");

textBox2.AppendText(fl.Name + " ");

textBox2.AppendText(fl.CreationTime + " ");

}

}

private void button3_Click(object sender, EventArgs e)

{

string [] disk = Directory.GetLogicalDrives(); //Получаем список дисков

foreach (string f2 in disk)

{

textBox3.AppendText(f2); textBox3.AppendText(" ");

}

}

private void button4_Click(object sender, EventArgs e)

{

Application.Exit();

}

}

}

Примеры решения задач

Задача 1. Разработайте программу, которая формирует одномерный массив целых чисел, вводимых пользователем. Полученный массив записывается в текстовый файл. Во второй программе следует осуществить чтение одномерного массива из файла и нахождение суммы его чисел. Результаты выведите в текстовые окна.

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

Листинг 170

using System.10; namespace WindowsApplicationl {

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

string[] b = new string[10];

StreamWriter zapis = File.CreateText(@"c:Proba.txt"); for (int i = 0; i <= 9; i++)

{

b[i] =

Microsoft.VisualBasic.Interaction.InputBox("Введите число", "Окно ввода данных", -1, -1);

zapis.WriteLine(b[i]);

}

zapis.Close();

}

}

}

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

Рис. 174. Сформированный массив

В листинге 171 приведен листинг программы, которая осуществляет чтение одномерного массива и нахождение суммы его элементов.

Листинг 171

using System.10; namespace WindowsApplicationl {

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

string r=null;

int sum = 0 ;

int[] a = new int[10];

string[] b;

StreamReader zapis = File.OpenText(@"c:Proba.txt"); while ((r = zapis.ReadLine()) != null)

{

b = r.Split(' ');//Метод Split() разделяет строку, на

элементы, используя указанный разделитель (пробел). Результатом является массив строк

textBoxl.AppendText(г + " "); for (int i = 0; i< b.Length; i++)

{

a[i] = Convert.ToIntl6(b[i]); sum = sum + a[i];

}

}

textBox2.Text = sum.ToString(); zapis.Close();

}

}

}

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

Рис. 175. Осуществлено чтение из файла и нахождение суммы элементов массива

Задача 2. Разработайте программу, которая формирует двумерный массив целых случайных чисел. Полученный массив записывается в текстовый файл. Во второй программе следует осуществить чтение матрицы из файла и нахождение в ней чисел, больше или равных 10. Результаты выведите в текстовые окна.

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

Листинг 172

using System.10; namespace WindowsApplicationl {

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

Random a = new Random(); int[,] b = new int[4, 4];

StreamWriter zapis = new StreamWriter(@"c:Proba.txt"); for (int i — 0; i < 4; i++)

for (int j = 0; j < 4; j++)

{

b[i, j] = a.Next(1, 5); zapis.WriteLine(b[i,j]) ;

}

}

zapis.Close();

}

}

}

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

Листинг 173 namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

string r = null; int kol = 0;

int[,] a = new int[4,4]; string[] b = new string[l];

StreamReader zapis = new StreamReader(@"c:Proba.txt"); while ((r = zapis.ReadLine()) != null)

{

for (int i — 0; i < b.Length; i++)

{

for (int j =0; j < b.Length; j++)

{

b = r.Split(' ');

a[i, j] = Convert.ToIntl6(b[i]); textBoxl.AppendText(r + " "); if (a[i, j] >= 10) kol = kol + 1;

}

}

}

textBox2.Text = kol.ToString(); zapis.Close();

}

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

Рис. 176. Количество чисел, больше или равных десяти, равно 7

Контрольные вопросы к главе

1. Что представляет собой файл?

2. Поясните разницу между понятиями «процесс» и «поток».

3. Какие классы используются для работы с потоками символьной информации?

4. Назовите методы, с помощью которых можно записать или прочитать информацию.

5. Какие методы используются для доступа к информации о файлах и директориях?

6. Какие компоненты позволяют получить доступ к информации о дисках, директориях и файлах?

Задачи для самостоятельного решения

1. Подсчитайте количество сдвоенных символов 'аа', 'оо', 'кк' в тексте, расположенном в текстовом файле, затем удалите повторяющийся символ и полученную строку запишите в другой файл.

2. Подсчитайте число слов в предложении, записанном в текстовом файле.

3. Найдите в текстовом файле самое длинное и самое короткое слово.

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

5. Проверить, правильно ли расставлены в тексте, расположенном в текстовом файле, круглые скобки. Если неправильно — исправить, а результат сохранить в файле.

6. В последовательности символов, заданной в текстовом файле, подсчитать общее количество символов

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

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

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

10. Перепишите текстовый файл таким образом, чтобы все слова исходного текста были перевернуты. Результат запишите в другой файл.

11. В исходном текстовом файле замените все вхождения подстроки Е на подстроку 2. Результат запишите в другой файл.

12. Для заданного символа определить, сколько раз он встречается во введенном тексте файла. Результат запишите в другой файл.

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

14. Из текста, расположенного в файле, исключить однобуквенные слова. Результат запишите в другой файл.

15. Из текста, расположенного в файле, удалите лишние пробелы, разделяющие слова.

16. Дан текстовый файл, содержащий целые числа. Найдите сумму четных элементов в каждой строке и допишите их в конец файла.

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

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

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

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

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

22. Даны два текстовых файла. Запишите в третий только те строки, которые есть и в первом и во втором файлах.

23. Дан текстовый файл. Допишите в него следующие данные: количество строк, количество символов в каждой строке, количество цифр в каждой строке.

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

 
Если Вы заметили ошибку в тексте выделите слово и нажмите Shift + Enter
 
Популярные страницы