русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Потоки символів


Дата додавання: 2015-01-08; переглядів: 910.


Символьні потоки StreamWriter і StreamReader працюють з Unicode-символами. Ці потоки є спадкоємцями класів TextWriter і TextReader. У таблицях 11.6 і 11.7 приведені найбільш важливі елементи цих класів. Як бачите, довільний доступ для текстових файлів не підтримується.

 

Таблиця 11.6

Найбільш важливі елементи базового класу TextWriter

 

Елемент Опис
Close Закрити файл і звільнити пов'язані з ним ресурси. Якщо в процесі запису використовується буфер, він буде автоматично очищений
Flush Очистити всі буфери для поточного файлу і записати накопичені в них дані в місце їх постійного зберігання. Сам файл при цьому не закривається
NewLine     Використовується для завдання послідовності символів, що означають початок нового рядка. За умовчанням використовується послідовність “повернення каретки” - “переведення рядка” ( \r \n)
Write Записати фрагмент тексту в потік
WriteLine Записати рядок в потік і перейти на інший рядок

 

Таблиця 11.7

Найбільш важливі елементи класу TextReader

 

Елемент Опис
Peek Повернути наступний символ, не змінюючи позицію покажчика у файлі
Read Рахувати дані з вхідного потоку
ReadBlock Рахувати з вхідного потоку вказану користувачем кількість символів і записати їх в буфер, починаючи із заданої позиції
ReadLine Рахувати рядок з поточного потоку і повернути його як значення типу string. Порожній рядок (null) означає кінець файлу (EOF)
ReadToEnd Рахувати всі символи до кінця потоку, починаючи з поточної позиції, і повернути дані як один рядок типу string

 

Ви вже знайомі з деякими методами, приведеними в цих таблицях: впродовж всього посібника постійно використовувалися методи читання з текстових потоків і запису в текстові потоки, але не для дискових файлів, а для консолі, яка є їх окремим випадком.

У лістингу 11.3 створюється текстовий файл, в який записуються два рядки. Другий рядок формується з перетворених чисельних значень змінних і пояснюючого тексту. Вміст файлу можна подивитися в будь-якому текстовому редакторові. Файл створюється в тому ж каталозі, куди середовище записує виконуваний файл. За умовчанням це каталог ...\ConsoleApplication1\bin\Debug.

 

Лістинг 11.3. Виведення в текстовий файл

 

using System;

using System.IO;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace examp76

{

class Program

{

static void Main(string[] args)

{

try

{

StreamWriter f = new StreamWriter( "text.txt" );

f.WriteLine( "ABCDEF:" );

double a = 12.234;

int b = 29;

f.WriteLine( " a = {0,6:C} b = {1,2:X}", a, b );

Console.WriteLine(" a = {0,6:C} b = {1,2:X}", a, b);

f.Close();

}

catch( Exception e )

{

Console.WriteLine( "Error: " + e.Message );

return;

}

}

}

}

 

 

У лістингу 11.4 файл, створений в попередньому прикладі, виводиться на екран.

 

Лістинг 11.4. Читання текстового файлу

 

using System;

using System.IO;

namespace exam77

{

class Class1

{

static void Main()

{

try

{

StreamReader f = new StreamReader( "1.txt" );

string s = f.ReadToEnd();

Console.WriteLine(s);

f.Close();

}

catch( FileNotFoundException e )

{

Console.WriteLine( e.Message );

Console.WriteLine( " Проверьте правильность имени файла!" );

return;

}

catch( Exception e )

{

Console.WriteLine("Error:" + e.Message);

return;

}

}

}

}

 

У цій програмі весь файл прочитується за один прийом за допомогою методу ReadToEnd. Частіше виникає необхідність прочитувати файл порядково, такий приклад приведений в лістингу 11.5.

 

Лістинг 11.5. Порядкове читання текстового файлу

using System;

using System.IO;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace examp78

{

class Class1

{

static void Main()

{

try

{

StreamReader f = new StreamReader( "1.txt" );

string s;

long i = 0;

while ( ( s = f.ReadLine() ) != null )

Console.WriteLine( " {0} : {1} ", ++i, s );

f.Close();

}

catch( FileNotFoundException e )

{

Console.WriteLine( e.Message );

Console.WriteLine( " Перевірте правильність імені файлу!" );

return;

}

catch ( Exception e )

{

Console.WriteLine( "Error: " + e.Message );

return;

}

}

}

}

 

Приклад перетворення чисел, що містяться в текстовому файлі, в їх внутрішню форму представлення приведений в лістингу 11.6. У програмі обчислюється сума чисел в кожному рядку.

На вміст файлу накладаються строгі обмеження: числа мають бути розділені рівно одним пропуском, після останнього числа в рядку пропуску бути не повинно, файл не повинен закінчуватися символом переведення рядків. Методи розбиття рядка і перетворення в цілочисельне представлення розглядалися раніше.

 

Лістинг 11.6. Перетворення рядків в числа

using System;

using System.IO;

namespace examp80

{ class Class1

{ static void Main()

{

try

{

StreamReader f = new StreamReader("1.txt" );

string s;

const int n = 20;

int[] a = new int[n];

string[] buf;

while (( s = f.ReadLine() ) != null )

{

buf = s.Split(' ') ;

long sum = 0;

for ( int i = 0; i < buf.Length; ++i )

{

a [i] = Convert.ToInt32( buf[i] );

sum += a [i] ;

}

Console.WriteLine( "{0} сумма: {1}", s, sum );

}

f.Close();

}

catch( FileNotFoundException e )

{

Console.WriteLine( e.Message );

Console.WriteLine( " Перевірте правильність імені файлу!" );

return;

}

catch ( Exception e )

{

Console.WriteLine( "Error; " + e.Message );

return;

}

}

}

}

 

Результат роботи програми:

1 2 4 сума: 7

3 44 -3 6 сума: 50

8 1 1 сума: 10


<== попередня лекція | наступна лекція ==>
Асинхронне уведення-виведення | Двійкові потоки


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн