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