You are on page 1of 32

Файлове

ИЗГОТВИЛ: ВАНЯ
ЯНЕВА
1. Потоци от данни.
В езиците за програмиране съществува възможност програмата както
да чете входните си данни от файл, така и да извежда изходните си
данни във файл.
Файловете се разглеждат като потоци – подредени последователности
от байтове, които се изпращат от едно устройство и се получават в
друго устройство.
Потоците позволяват само последователен достъп до данните.
Всички потоци в С# се намират в пространството от имена System.IO
което означава, че ако искаме да използваме файлове, в началото на
програмите трябва да добавим директивата:
using System.IO;
2. Четене от текстов файл.
За да може компютъра да чете входните данни от текстов файл,
трябва да се свърже специална променлива от класа StreamReader
(логически файл) с реалния файл, разположен на носител на данни
(физически файл).
Това става по време на инициализацията на тази променлива с
помощта на специален метод, който се нарича конструктор и се
пише след ключовата дума new и има същото име като класа:
SreamReader r = new StreamReader (<име на файл>,
Encodig.GetEncoding(“windows-1251”));
Този метод има два аргумента – първият е името на
физическия файл и е от тип низ, а втория аргумент задава
кодирането на файла, за да можем да четем кирилица от него.
Ако файлът не се намира в текущата папка на изпълнимия
файл на програмата, тогава трябва да се зададе и пътят до
него, като е препоръчително този път да започва от папката на
изпълнимия файл – това прави програмата по независима при
евентуалния й пренос на друг компютър.
Самото четене на данни от файла става с помощта на
променливата r, която играе ролята на логически файл и може
да стане по два начина.
Първи начин: програмата прочита целия текстов файл наведнъж
като един низ с метода ReadToEnd( ) на класа StreamReader. След
това файлът може да бъде обработван или показан в
интерфейсния елемент richTextBox:
String textFile = r.ReadToEnd( );
richTextBox1.Text = textFile;
Втори начин: файла се чете ред по ред чрез метода ReadLine( ) на
класа StreamReader, който работи по същия начин като метода
ReadLine( ) на класа Console. За целта трябва да се използва
оператор за цикъл.
Най-подходящ е оператора while, тъй като обикновенно не се
знае от колко реда е файлът. Когато се достигне края на файла
се прочита неговия знак за край null и това може да се
използва за условие за край на цикъла. Променливата, която
ще се използва в цикъла трябва да е от тип низ, защото
текстовия файл е последователност от редове от тип низ:
string line = “”;
while (line != null)
{
line = r.ReadLine( );
richTextBox1.Text = richTextBox1.Text + line +”\n”;
}
След като приключим работата с файла трябва да го
затворим с метода Close( ) на класа StreamReader, т.е.
r.Close( );
Ако искаме да започнем да четем файла отначало,
трябва да отворим файла с метода – конструтор.
3. Записване в текстов файл.
В С# се използват методите WriteLine( ) и Write( ) на
класа StreamWriter, които работят по същия начин като
методите WriteLine( ) и Write( ) на класа Console.
Първоначално трябва да свържем променлива от класа
StreamWriter с физическия файл, в който ще записваме.
Това става по време на инициализацията на променлива
с помощта на специален метод, който се нарича
коструктор и се пише след ключовата дума new и има
същото име като класа:
StreamWtiter w = new StreamWriter (<име на файла>,
<true/false>, Encoding.GetEncoding(“windows-1251”));
Този метод има три аргумента:
1. Името на физическия файл от тип низ. Ако е необходимо може да се
зададе и път до файла, за да бъде посочено мястото за неговото
създаване. Ако не се зададе път, то файлът се създава в текущата папка
на изпълнимия файл на програмата.
2. Логически тип: true – ако файла съществува и данните се добавят в
края на файла и false – ако файлът се презапише т.е. изтриват се всички
предишни данни.
3. Кодиране на файла за да можем да пишем на кирилица в него.
Записването на данни във файла става с метода WriteLine като
за аргумент се използва низ, който ще се запише във файла:
w.WriteLine(“Николай Петков“);
След приключване на записването във файла задължително
трябва да затворим файла чрез метода Close( ) на класа
StreamWriter:
w.Close( );
По този начин във файла се добавя знак за край на файла и се
извършва съхраняването му.
4. Работа с компютър.
Зад1:
Допълнете създадената в предишния урок програма
clasResults с възможност за съхраняване на данните в
текстов файл с име clasFile.txt.
Решение:
Допълваме формата с два бутона – за съхранение на
данните на класа в текстов файл и за прочитане на
данните за класа от текстов файл в паметта. Ще напишем
код само на бутона Запази файл:
Интерфейс:

Нови бутони
Код на бутона „запази файл“:

private void button1_Click(object sender, EventArgs e)


{
StreamWriter w = new StreamWriter("classFile.txt", false, Encoding.GetEncoding("Unicode"));
for (int i = 1; i <=26; i++)
{
w.Write (clasOf[i].clas + ""); w.Write(clasOf[i].num + "");
w.Write(clasOf[i].name + ""); w.Write(clasOf[i].BEL + "");
w.Write(clasOf[i].Foreign + ""); w.Write(clasOf[i].Math + "");
w.Write(clasOf[i].Physics + "");
double t = Math.Round(clasOf[i].average * 100) / 100;
}
w.Close();
}
Резултат:
Резултат:
Когато се натисне бутон „запази файл“ резултатите се съхраняват във
файл clasFile, който се намира в :
ClasResults/ ClasResults/Bin/Debug
Вариант1:
Код на бутон Зареди файл :
private void button1_Click(object sender, EventArgs e)
{
StreamReader r = new StreamReader("classFile.txt",
Encoding.GetEncoding("windows-1251"));
string textFile =r.ReadToEnd(); //чете файла наведнъж
richTextBox1.Text = textFile;
}
Вариант2:
Код на бутон Зареди файл :
private void button1_Click(object sender, EventArgs e)
{
StreamReader r = new StreamReader("classFile.txt",
Encoding.GetEncoding("windows-1251"));
string line = "";
while (line != null)
{
line = r.ReadLine(); //чете файла ред по ред
richTextBox1.Text += line + "\n";
}
}
Важно:
Всички останали кодове са като зад.1 (вариант 2)
от презентацията 23. Агрегатни типове.
Резултат:
Зад3:
Направете графично приложение с име Marks, в
което да прочете от файл с име students.txt
оцеките на учениците от един клас от контролно
по информатика и да изведе в 5 етикета броя на
слабите, средните, добрите, много добрите и
отлични оценки.
Код на бутона „Изчисли“:
StreamReader r = new StreamReader("students.txt",
Encoding.GetEncoding("windows-1251"));
int num2 = 0, num3 = 0, num4 = 0, num5 = 0, num6 = 0;
string line = "";
while(line!=null)
{
line = r.ReadLine();
if (line == "2") { num2++; }
if (line == "3") { num3++; }
if (line == "4") { num4++; }
if (line == "5") { num5++; }
if (line == "6") { num6++; }
}
r.Close();
label2.Text = num2.ToString();
label4.Text = num3.ToString();
label6.Text = num4.ToString();
label8.Text = num5.ToString();
label10.Text = num6.ToString();
}
Обяснения: оценките се четат от файла ред по ред и в
цикъла всеки път се проверява дали прочетения ред съвпада
с някоя от оценките от 2 до 6. Използват се 5 променливи –
броячи, в които се натрупват броя на оценките от всеки вид.
След края на цикъла файла се затваря и с метода ToString се
извеждат броя на оценките.
Трябва да се създаде файл
students.txt в Notepad, като
въвеждате оценките и този
файл се съхранява в:
Marks/ Marks/Bin/Debug
Зад4: Създайте графично приложение с име Average,
което чете от файл с име students.txt оценките от
контролно по информатика на учениците от един клас
и извежда в етикет средния успех на учениците от
това контролно с точност до втория знак след
десетичната запетая.
Код на бутон „Изчисли“:
{
StreamReader r = new StreamReader("Students.txt", Encoding.GetEncoding("windows-
1251"));
int num = 0;
double sum = 0;
string line = "";
while (line != null)
{line = r. ReadLine();
if (line !=null)
{sum = sum + double.Parse(line);
num++;
}
}
r.Close();
sum = Math.Round(sum/num, 2);
label12.Text = sum.ToString();
}
Students.txt

Съхранява се в Average/Average /Bin/Debug


Зад5: Създайте графично приложение с име
Height, което чете от файл с име students1.txt
височината в сантиметри на учениците от един
клас, подредени по номера и извежда в етикет
номера и височината на най-високия ученик в
класа. Ако има повече от един най-висок ученик,
програмата извежда този с най-малък пореден
номер.
Код на бутона „Намери“:
{
StreamReader r = new StreamReader("students1.txt", Encoding.GetEncoding("windows-
1251"));
int num = 0, maxHeight = 0, cnt = 0;
string line = "";
while ((line = r.ReadLine()) != null)
{ int height = int.Parse(line);
cnt++;
if (height > maxHeight)
{ maxHeight = height;
num = cnt;
}
}
label1.Text = "Най-високият ученик от класа е с номер"
+ num + "и е висок" + maxHeight + "см.";
}
students1.txt.
Съхранява се в
Height/Height/Bin/Debug

You might also like