Uploaded by Google Account

Рад са бинарним фајловима у C#

advertisement
7-Amaliy mashg’ulot.Matn va binar fayllar bilan ishlash.
BinaryWriter va BinaryReader bir nechta sinflari ikkilik fayllar bilan ishlash
uchun mo'ljallangan. Bu sinflar ikkilik formatda ma'lumotlarni o'qish va yozish
imkonini beradi.
1. Faylga yozish va turli formatdagi raqamlarni fayldan o'qish (double,
char, string, sbyte). Misol
Misol quyidagi ma'lumotlarni file2.bin ga yozish va o'qishni ko'rsatadi:
• double turdagi raqamlar;
• string tipidagi satrlar;
• char tipidagi xarakter;
• sbayt tipidagi raqamlar.
using System;
using System.IO;
using System.Text;
namespace ConsoleApp10
{
class Program
{
static void Main(string[] args)
{
// file2.bin faylga quyidagi malumotlar yozildi:
// - double tip ;
// - string tip ;
// - char tip;
// - sbyte tip.
// 1. Sonlarni yzoish
using (FileStream fs = new FileStream("file2.bin",FileMode.Create))
{
using (BinaryWriter bw = new BinaryWriter(fs, Encoding.Default))
{
// 1.2. Kiruvchi sonlar
double x = 3.88;
string s = "Hello world!";
char c = 'Z';
sbyte b = 17;
// 1.3. Sonlarni yozish - Write() metodi
bw.Write(x);
bw.Write(s);
bw.Write(c);
bw.Write(b);
}
}
// 2. Sonlarni o’qish
using (FileStream fs = new FileStream("file2.bin",FileMode.Open))
{
using (BinaryReader br = new BinaryReader(fs, Encoding.Default))
{
// 2.1. Ma'lumotlar o'qiladigan o'zgaruvchilar
double x2;
string s2;
char c2;
sbyte b2;
// 2.2. Ma'lumotlarni o'qish
x2 = br.ReadDouble();
s2 = br.ReadString();
c2 = br.ReadChar();
b2 = br.ReadSByte();
// 2.3. Natijani nazorat qilish uchun chiqarish
Console.WriteLine("x2 = {0}", x2);
Console.WriteLine("s2 = {0}", s2);
Console.WriteLine("c2 = {0}", c2);
Console.WriteLine("b2 = {0}", b2);
}
}
}
}
}
Dasturning bajarilishi natijasi
x2 = 3.88
s2 = Hello world!
c2 = Z
b2 = 17
2. Faylga yozish va float[] sonlari massivini fayldan o'qish. Misol
Har qanday massivni yozish uchun siz quyidagi harakatlar ketma-ketligini
bajarishingiz kerak:
1. Massivdagi elementlar sonini yozing.
2. 1. Massiv elementlarini siklda yozing.
3. Massivni o'qiyotganda siz bir xil harakatlar ketma-ketligini bajarishingiz
kerak:
Massivdagi elementlar sonini hisoblang.
4. sikl operatori yordamida massiv elementlarini sanang.
using System;
using System.IO;
using System.Text;
namespace ConsoleApp10
{
class Program
{
static void Main(string[] args)
{
// file3.bin ga float[] sonlari qatorini yozing
// 1. Raqamlarni yozish
using (FileStream fs = new FileStream("file3.bin",
FileMode.Create))
{
using (BinaryWriter bw = new BinaryWriter(fs, Encoding.Default))
{
// 1.2. Berilgan massiv
float[] AF = { 2.1f, 3.8f, 4.4f, -2.3f, -1.3f };
// 1.3. Massivni yozish
// Dastavval sonlar miqdorini yozamiz
bw.Write(AF.Length);
// massiv elementlarini yozish sikliЦикл записи элементов массива
for (int i = 0; i < AF.Length; i++)
bw.Write((double)AF[i]); // double kabi yozish
}
}
// 2. Fayldan float tipli massivini o'qish
using (FileStream fs = new FileStream("file3.bin", FileMode.Open))
{
using (BinaryReader br = new BinaryReader(fs, Encoding.Default))
{
// 2.1. Massiv natijasi
float[] AF2;
// 2.2. Yozilgan sonlar miqdorini hisoblash
int count = br.ReadInt32();
AF2 = new float[count];
// 2.3. Massivni o'qish
for (int i = 0; i < count; i++)
AF2[i] = (float)br.ReadDouble(); // double sifatida o'qing
// 2.3. Natijani nazorat qilish uchun chiqarish
Console.Write("AF2 = { ");
for (int i = 0; i < AF2.Length; i++)
Console.Write(AF2[i] + " ");
Console.WriteLine(" }");
}
}
}
}
}
Dasturning bajarilishi natijasi
AF2 = { 2.1 3.8 4.4 -2.3 -1.3 }
3. Satrlar massivini (string[]) faylga yozish va uni fayldan o‘qish uchun
dastur. Misol.
Vazifa. Ikki usulni o'z ichiga olgan ReadWriteArrayOfStrings nomli sinfni
ishlab chiqing:
• WriteArrayStr() usuli – faylga satrlar massivini yozadi;
• ReadArrayStr() usuli — fayldagi qatorlarni massivga o‘qiydi.
Faylga yozish uchun BinaryWriter sinfidan foydalaning. Fayldan o'qish uchun
BinaryReader sinfidan foydalaning.
Sinfni sinab ko'ring.
Yechim. BinaryWriter va BinaryReader sinflari oqim adapterlari bo'lganligi
sababli, faylga to'g'ridan-to'g'ri kirish uchun siz asosiy do'kondagi tegishli sinfdan
foydalanishingiz kerak. FileStream klassi fayllarga kirish uchun ishlatiladi.
using System;
using System.IO;
namespace ConsoleApp10
{
// Bayt oqimiga Satrlar qatorini yozish/o'qish usullarini o'z ichiga olgan sinf.
class ReadWriteArrayOfStrings
{
// Faylga satrlar massivini yozish metodi.
// Metod parametrlari:
// - AS – satrlar massivi;
// - filename – fayl nomi.
public void WriteArrayStr(string[] AS, string filename)
{
// 1. Oqim yarating va uni fayl nomi bilan bog'lang
// Use direktivasi resursni avtomatik tozalashni ta'minlaydi.
using (FileStream fs = new FileStream(filename, FileMode.Create,
FileAccess.Write))
{
// 2. fs oqimini bw misoli bilan bog'lash:
// bw -> fs -> filename
BinaryWriter bw = new BinaryWriter(fs);
// 3. Faylga qatorlar sonini yozing
bw.Write(AS.Length);
// 4. Satrlar massivini faylga yozish sikli
for (int i = 0; i < AS.Length; i++)
{
bw.Write(AS[i]);
}
}
}
// Fayldan satrlarni o'qish metodi
public string[] ReadArrayStr(string filename)
{
// O'qish uchun faylni ochishga urinish
using (FileStream fs = new FileStream(filename, FileMode.Open,
FileAccess.Read))
{
// br misolini fs ga ulash:
// br <- fs <- filename
BinaryReader br = new BinaryReader(fs);
// Satrlar massividagi elementlar sonini o'qing
int count = br.ReadInt32();
// Satrlar massivini e'lon qiling va unga xotira ajrating
string[] AS = new string[count];
// AS massividagi satrlarni o'qing
for (int i=0; i<AS.Length; i++)
{
// O'qish qatori
AS[i] = br.ReadString();
}
// Natijani qaytarish
return AS;
}
}
}
class Program
{
static void Main(string[] args)
{
// ReadWriteArrayOfStrings sinfini sinab ko'rish
// 1. Sinf namunasini yarating
ReadWriteArrayOfStrings obj = new ReadWriteArrayOfStrings();
// 2. Sinov uchun qatorlar qatorini e'lon qiling
string[] AS = { "abc", "def", "ghi", "jklmn", "jprst" };
// 3. "myfile.bin" fayliga satrlarni yozish usulini chaqiring.
obj.WriteArrayStr(AS, "myfile.bin");
// 4. Xuddi shu fayldan boshqa massivdagi satrlarni o'qing
string[] AS2 = obj.ReadArrayStr("myfile.bin");
// 5. O'qish satrlarini chiqarish
Console.WriteLine("Array AS2:");
foreach (string s in AS2)
Console.WriteLine(s);
}
}
}
Dasturning bajarilishi natijasi
Array AS2:
abc
def
ghi
jklmn
jprst
Amalga oshirilgandan so'ng, "myfile.bin" nomli fayl yaratiladi.
4. Ishchi sinfi misollarini yozish/o'qish misoli
Vazifa. Ishchini amalga oshiradigan ishchi sinfi aniqlanadi. Sinf quyidagi
ichki maydonlarni o'z ichiga oladi:
• xodimning ismi;
• qavat;
• yosh;
• reyting.
Dasturda siz quyidagi amallarni ketma-ket bajarishingiz kerak:
 Worker sinfi uchun massiv yaratish;
 bu massivni ikkilik formatda "workers.bin" fayliga yozish;
 "workers.bin" faylidagi ma'lumotlarni boshqa massivga o'qish;
 nazorat qilish uchun olingan massivni ekranga chiqarish.
Yechim. FileStream klassi fayl xotirasiga kirish uchun ishlatiladi.
Ikkilik formatda faylga yozish uchun BinaryWriter sinfining Write() usulidan
foydalaning. Faylni ikkilik formatda o'qish uchun BinaryReader sinfining quyidagi
usullari qo'llaniladi:
 ReadInt32() — fayl oqimidan int tipini uqish;
 ReadDouble() — double tipli sonni uqish;
 ReadChar() —char tipli simvolni uqish;
 ReadString() —satr simvollarini uqish.
Masalani yechish dasturining matni quyidagicha.
using System;
using System.IO;
using System.Text;
namespace ConsoleApp10
{
// Ishchini amalga oshiradigan sinf
class Worker
{
// Sinf maydoni
private string name; // Familiya va ism ishchining
private char gender; // jinsi
private int age; // Yoshi yilda
private double rank; // reyting
// Konstruktor
public Worker(string name, char gender, int age, double rank)
{
this.name = name;
this.gender = gender;
this.age = age;
this.rank = rank;
}
// Sinf maydoniga kirish xususiyatlari
public string Name
{
get { return name; }
set { name = value; }
}
public char Gender
{
get { return gender; }
set { gender = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
public double Rank
{
get { return rank; }
set { rank = value; }
}
// Joriy sinfning chiqish metodi
public void Print(string text)
{
Console.Write(text + " ");
Console.Write("name = {0}, gender = {1}, age = {2}, rank = {3}",
name, gender, age, rank);
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
// "workers.bin" fayliga Worker tipidagi misollar qatorini yozing
// 1. Misollar massivini yozing
using (FileStream fs = new FileStream("workers.bin",
FileMode.Create))
{
using (BinaryWriter bw = new BinaryWriter(fs, Encoding.Default))
{
// 1.1. To'rtta ishchini yarating - bu qayd etilayotgan ma'lumotlar
Worker[] AW = {
new Worker("Johnson J.", 'M', 42, 4.45),
new Worker("Johansson S.", 'F', 33, 4.77),
new Worker("Shcherbyuk I.", 'M', 49, 4.99),
new Worker("Ivanov I.", 'M', 39, 4.8)
};
// 1.2. AW massivini faylga yozish
// 1.2.1. Avval xodimlar sonini yozing
bw.Write(AW.Length);
// 1.2.2. Keyin har bir ishchini pastadirga yozing
foreach (Worker w in AW)
{
// Ishchining ismi
bw.Write(w.Name);
// jinsi
bw.Write(w.Gender);
// Yoshi
bw.Write(w.Age);
// Reyting.
bw.Write(w.Rank);
}
}
}
// 2. "workers.bin" faylidan Worker tipidagi massivni o'qish
using (FileStream fs = new FileStream("workers.bin", FileMode.Open))
{
using (BinaryReader br = new BinaryReader(fs, Encoding.Default))
{
// 2.1. Fayldagi ma'lumotlar saqlanadigan massivni e'lon qiling,
//, shuningdek, qo'shimcha o'zgaruvchilar
Worker[] AW2;
string name;
char gender;
int age;
double rank;
string s; // yordamchi qator
// 2.2. Saqlangan holatlar sonini o'qing
// va ular uchun xotira ajrating
AW2 = new Worker[br.ReadInt32()];
// 2.3. AW2 massivida ishchi sinfi misollarini o'qing
for (int i = 0; i < AW2.Length; i++)
{
// ismni uqish
name = br.ReadString();
// jinsni uqish
gender = br.ReadChar();
// yoshni uqish
age = br.ReadInt32();
// reytingni uqish
rank = br.ReadDouble();
// AW2[i] uchun xotira ajrating va egzimplyar hosil qiling
AW2[i] = new Worker(name, gender, age, rank);
}
// 2.4. Worker sinfining o'qilgan egzimplyarlari haqidagi ma'lumotlarni
ko'rsatish
for (int i = 0; i < AW2.Length; i++)
{
// qator hosil qiladi
s = "AW2[" + Convert.ToString(i) + "]: ";
// egzimplyar ma'lumotlarini chop etish
AW2[i].Print(s);
}
}
}
}
}
}
Dasturning bajarilishi natijasi
AW2[0]: name = Johnson J., gender = M, age = 42, rank = 4.45
AW2[1]: name = Johansson S., gender = F, age = 33, rank = 4.77
AW2[2]: name = Shcherbyuk I., gender = M, age = 49, rank = 4.99
AW2[3]: name = Ivanov I., gender = M, age = 39, rank = 4.8
Download