- •Модуль 1. Мова програмування с# і платформа ms.Net Framework Лекція 7. Робота з файлами
- •7.1. Введення-виведення на консоль
- •7.2. Файлове введення-виведення
- •7.3. Потоки. Абстрактний клас Stream і його нащадки
- •7.4. Класи StreamReader, StreamWriter, StringReader, StringWriter
- •Питання і завдання для самостійної роботи студента
- •12. Лабораторна робота № 6
7.4. Класи StreamReader, StreamWriter, StringReader, StringWriter
Ці класи лежать в основі роботи з текстовими файлами і дозволяють працювати з потоком як з текстовим файлом, читаючи і записуючи в потік дані різних скалярних типів. Клас Reader є нащадком абстрактного класу TextReader, клас Writer – нащадком класу TextWriter. Класи StringReader і StringWriter дозволяють розглядати рядок як потік.
StreamReader – містить властивості і методи, що забезпечують читання даних з текстового файлу як потоку байтів.
StreamWriter – містить властивості і методи, що забезпечують запис символів в байтовий потік.
Таблиця 7.3. Основні методи класу StreamReader
Метод |
Призначення |
int Read() int Read (char[] buff, int index, int count) |
має дві реалізації. Перша повертає черговий символ, прочитаний з потоку, пересуваючи покажчик потоку вправо. Друга реалізація дозволяє прочитати задане число символів з потоку в масив, переданий як аргумент методу Read |
int ReadBlock(char[] array, int offset, int count) |
дозволяє прочитати задане число символів з потоку в масив |
int Peek() |
читає наступний символ, не змінюючи стан покажчика потоку. Повертає наступний доступний символ, не прочитуючи його насправді з потоку вхідних даних |
string ReadLine() |
читає і повертає черговий рядок тексту з потоку. Це означає, що читаються символи потоку, поки не зустрінуться символи кінця рядка або кінця файлу. Якщо в потоці символів немає і досягнутий кінець файлу, то в результаті повертається null – посилання на відсутнє значення. |
string ReadToEnd() |
читає всі символи з потоку, що залишилися, аж до кінця файлу |
void Close() |
закриває вхідний потік |
Таблиця 7.4. Основні методи класу StreamWriter
Метод |
Призначення |
Write |
має різні реалізації для виведення різних типів даних. |
WriteLine (...) |
виводить у потік дані, розділяючи їх символами кінця рядка |
void Close() |
закриває потік |
Приклад 7.3. В цьому прикладі спочатку створюється об'єкт f класу StreamWriter, який містить файл для виводу output.txt. Далі визначаються і ініціалізуються змінна int i та string s, які записуються у вихідний файл. Метод Close() закриває файл.
using System.IO; // 1
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
StreamWriter f = new StreamWriter( "output.txt" ); // 2
int i = 3;
string s = "Мова програмування С# - це C++++ ";
f.WriteLine( "i = " + i ); // 3
f.WriteLine( "s = " + s ); // 4
f.Close(); // 5
}
}
}
Таким чином, щоб використовувати в програмі файли, необхідно:
Підключити простір імен, в якому описуються стандартні класи для роботи з файлами (оператор 1).
Оголосити файлову змінну і зв'язати її з файлом (оператор 2).
Виконати операції введення-виводу (оператори 3–4).
Закрити файл (оператор 5).
Приклад 7.4.
Введення даних з файлу виконується аналогічно. У наступному прикладі наведено програму, в якій введення виконується з файлу з іменем input.txt, розташованому в каталозі D:\C#.
using System;
using System.IO;
namespace ConsoleApplication1
{ class Class1
{ static void Main()
{
StreamReader f = new StreamReader( "d:\\C#\\input.txt" );
string s = f.ReadLine();
Console.WriteLine( "s = " + s );
char c = (char)f.Read();
f.ReadLine();
Console.WriteLine( "c = " + c );
string buf;
buf = f.ReadLine();
int i = Convert.ToInt32( buf );
Console.WriteLine( i );
buf = f.ReadLine();
double x = Convert.ToDouble( buf );
Console.WriteLine( x );
buf = f.ReadLine();
double y = double.Parse( buf );
Console.WriteLine( y );
buf = f.ReadLine();
decimal z = decimal.Parse( buf );
Console.WriteLine( z );
f.Close();
}
}
}
Приклад 7.5. Збереження в текстовому файлі (для Windows Forms)
//створюємо об'єкт myfile класу FileInfo - це файл, в який будемо виводити
//властивість Application.StartupPath - шлях до програми в період виконання
System.IO.FileInfo myfile = new FileInfo(Application.StartupPath + "\\tests.txt");
//потік для запису StreamWriter. Створюємо об'єкт sw
System.IO.StreamWriter sw;
//якщо файл з таким іменем існує, видаляємо його
if (myfile.Exists)
{
myfile.Delete();
}
//якщо файлу немає - створюємо його і відкриваємо потік для запису
sw = myfile.CreateText(); //створюємо потік, який записує текст в новий файл
sw.Write(txtOut.Text); //метод Write записує рядок у файл
sw.Close(); //метод Close закриває файл
Приклад 7.6. Читання текстового файлу
using System;
using System.IO;
public class TextFromFile
{
private const string FILE_NAME = "MyFile.txt";
public static void Main(String[] args)
{
if (!File.Exists(FILE_NAME))
{
Console.WriteLine("{0} does not exist.", FILE_NAME);
return;
}
using (StreamReader sr = File.OpenText(FILE_NAME))
{
String input;
while ((input=sr.ReadLine())!=null)
{
Console.WriteLine(input);
}
Console.WriteLine ("The end of the stream has been reached.");
sr.Close();
}
}
Висновки
В С# є велика кількість методів, які забезпечують введення і виведення на консоль і в текстовий файл. Для роботи з консоллю призначений клас System.Consol.
Для роботи з файлами і потоками використовуються класи FileStream, StreamWriter, StreamReader, FileInfo і інші класи.
Для введення і виведення даних не потоками, а рядками призначені класи StringReader, StringWriter.
