
- •Язык c# и структура простой программы
- •Что такое .Net Framework
- •Что такое с#
- •Создание первой программы на с#
- •Пространство имен System
- •С# как язык Объектно-Ориентированного Программирования (ооп)
- •Состав и назначение файлов проекта
- •Структура сборки
- •Элементы языка c#
- •Базовый синтаксис с#
- •Переменные
- •Числа без знака
- •Числа со знаком
- •Числа для финансистов
- •Текстовые символы
- •Логический тип данных
- •Литералы с плавающей точкой
- •Символьные литералы
- •Строковые литералы
- •Выражения и операторы с#
- •Инициализация переменных и оператор присваивания
- •Значение в левой части
- •Ввод данных с консоли
- •Математические операторы
- •Вычисление остатка при целочисленном делении
- •Унарные операторы
- •Унарное логическое отрицание
- •Составные операторы
- •Поразрядные операторы
- •Поразрядное логическое и
- •Поразрядное логическое или
- •Поразрядное логическое исключающее или
- •Унарная поразрядная операция дополнения
- •Поразрядный сдвиг
- •Пример использования поразрядных операторов
- •Логические операторы
- •Операторы отношения
- •Приоритеты операторов
- •Исполнители алгоритмов
- •Исполнитель Чертежник
- •Исполнитель Робот
- •Компьютер как формальный исполнитель алгоритмов
- •Блок-схема
- •Псевдокод
- •Необходимые свойства алгоритма
- •Понятие о временной сложности алгоритма
- •Примеры
- •Правила для определения сложности
- •Тернарный условный оператор
- •Применение логических операций
- •Конструкция выбора
- •Примеры применения оператора выбора
- •Объединение меток case
- •Пропущенный break
- •Пример программы: Простые числа
- •Пример обработки одномерного массива чисел
- •Использование генератора случайных данных
- •Использование оператора foreach
- •Типы задач обработки одномерных числовых массивов
- •Поиск элемента в массиве
- •Многомерные массивы
- •Базовые операции со строками
- •Методы типа string
- •Копирование и клонирование строк
- •Конкатенация строк
- •Извлечение подстроки
- •Вставка подстроки
- •Замена символов и строк
- •Удаление символов из строки
- •Удаление незначащих пробелов
- •Преобразование к верхнему и нижнему регистру
- •Выравнивание по левому и правому краю поля
- •Объединение массива строк
- •Разбор строки
- •Сравнение строк
- •Форматирование текстовых строк
- •Функции
- •Описание и использование функций
- •Возвращаемые значения
- •Передача параметров
- •Выходные параметры
- •Область действия переменных
- •Область действия переменных и управляющие конструкции
- •Рекурсия
- •Параметры функции Main()
- •Перегрузка функций
- •Перечислимый тип
- •Определение перечислимых типов
- •Структуры
- •Описание структур
- •Использование структур в качестве параметров функций
- •Использование структур в качестве возвращаемых значений функций
- •Функции структур
- •Файлы и потоки
- •Основные классы ввода и вывода
- •Классы для работы с потоками
- •Классы для работы с потоками текстовых символов
- •Работа с текстовыми файлами
- •Запись двоичных данных
- •Пример программы для работы с двоичным файлом
- •Просмотр содержимого каталога
- •Получение информации о каталоге
Пример программы для работы с двоичным файлом
Программа Binary демонстрирует некоторые приемы работы с двоичными файлами при помощи классов FileStream, BinaryWriter и BinaryReader.
using System;
using System.IO;
namespace Binary
{
class Program
{
static string testFile = "mydata.dat";
static void Main(string[] args)
{
if(File.Exists(testFile))
{
Console.WriteLine("Файл {0} уже существует", testFile);
Console.ReadLine();
return;
}
FileStream fs = new FileStream(testFile, FileMode.CreateNew);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write("Text string");
for(uint i = 0; i < 20; i++)
{
bw.Write(i);
}
bw.Close();
fs.Close();
fs = new FileStream(testFile, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
string s = br.ReadString();
Console.WriteLine(s);
for (uint i = 0; i < 20; i++)
{
Console.Write("{0} ", br.ReadUInt32());
}
br.Close();
fs.Close();
Console.WriteLine("\nФайл успешно создан");
Console.ReadLine();
}
}
}
В самом начале своей работы программа проверяет существование файла с именем mydata.dat, используя для этого метод Exists класса File:
if(File.Exists(testFile))
{
Console.WriteLine("Файл {0} уже существует", testFile);
Console.ReadLine();
return;
}
Класс File, предназначенный для работы с файлами и каталогами, мы рассмотрим позже. Пока же мы только заметим, что данный фрагмент кода проверяет существование файла mydata.dat в каталоге, который был текущим при запуске нашей программы на выполнение. Если такой файл там уже существует (например, был создан при предыдущем запуске этой программы), программа завершает свою работу с сообщением об ошибке.
Если же в текущем каталоге нет файла с именем mydata.dat, программа создает его, вызывая для этого конструктор класса FileStream с соответствующими параметрами:
FileStream fs = new FileStream(testFile, FileMode.CreateNew);
Так как мы указали режим создания потока FileMode.CreateNew, то новый файл будет создан в том случае, если файла с таким именем нет в текущем каталоге.
После создания потока FileStream, связанного с файлом, мы создаем поток bw класса BinaryWriter, предназначенный для записи в файл двоичных данных:
BinaryWriter bw = new BinaryWriter(fs);
На следующем шаге программа записывает в поток текстовую строку:
bw.Write("Text string");
Далее программа записывает в поток bw 20 чисел типа uint:
for(uint i = 0; i < 20; i++)
{
bw.Write(i);
}
После завершения записи оба потока закрываются методом Close:
bw.Close();
fs.Close();
На следующем этапе наша программа считывает содержимое только что записанного файла и отображает его на консоли.
Для этого она вначале открывает поток fs класса FileStream, указывая, что файл должен быть открыт только для чтения:
fs = new FileStream(testFile, FileMode.Open, FileAccess.Read);
Режим чтения задается константой FileAccess.Read. Далее на базе потока fs программа создает поток br класса Binary.Reader:
Binary.Reader br = new BinaryReader(fs);
Этот поток может быть использован для чтения из файла двоичных данных. Первым делом программа читает и отображает на консоли текстовую строку, записанную в файл:
string s = br.ReadString();
Console.WriteLine(s);
Далее она в цикле считывает 20 чисел и также отображает их на консоли:
for (uint i = 0; i < 20; i++)
{
Console.Write("{0} ", br.ReadUInt32());
}
Завершив работу с потоками, программа закрывает их:
br.Close();
fs.Close();
Далее она выводит на консоль сообщение об успешном создании файла и ждет, когда пользователь нажмет клавишу Enter, чтобы завершить свою работу:
Console.WriteLine{"\nФайл успешно создан");
Console.ReadLine();
Вот что появится на консоли после запуска программы:
Содержимое файла, созданного данной программой, можно просмотреть с помощью двоичного редактора или файлового коммандера. Используя Total Commander, можно просмотреть содержимое файла как в текстовом, так и в двоичном режиме. В текстовом режиме содержимое файла выглядит как
В этом режиме анализ содержимого файла достаточно затруднителен. Удобнее переключить программу просмотра в двоичный режим:
Обратите внимание, что в самом начале файла находится байт со значением 0х0В, вслед за которым идет текстовая строка в кодировке ASCII. Этот байт задает длину строки. Вслед за строкой идут 20 чисел, каждое из которых занимает 4 байта.
Управление каталогами
В библиотеке классов Microsoft .NET Framework предусмотрено мощное средство работы с каталогами — класс Directory. С помощью методов этого класса программа может выполнять такие действия, как получение списка логических дисков, определение текущего каталога, просмотр содержимого каталогов, создание и удаление каталогов, проверка их существования и пр.
Список логических дисков
Чтобы получить список всех логических дисков, имеющихся в системе, воспользуйтесь методом Directory.GetLogicalDrives:
string[ ] drives = Directory.GetLogicalDrives();
foreach(string s in drives)Console.Write("{0} ", s);
Этот метод не имеет параметров. После выполнения он возвращает ссылку на массив текстовых строк вида «С:\» с обозначениями всех доступных логических дисковых устройств.
Текущий каталог
С помощью метода Directory.GetCurrentDirectory программа может определить полный путь к текущему каталогу:
string currentDir = Directory.GetCurrentDirectory();
Console.WriteLine{"\пТекущий каталог: {0}", currentDir);
Метод возвращает этот путь в виде текстовой строки класса string.
При необходимости программа может определить диск, на котором находится текущий или любой другой каталог. Для этого она должна воспользоваться методом Directory.GetDirectoryRoot, передав ему в качестве параметра путь к нужному каталогу:
string directoryRoot = Directory.GetDirectoryRoot(currentDir);
Console.WriteLine("Корень диска с текущим каталогом: {0}",directoryRoot);