Феноменальный Источник Ресурсов сети - Практический пример. Показ содержимого директории.
Четверг, 17.05.2012, 03:12
Приветствую Вас Гость


Общение на сайте
200
Все Новости
Обновление сайта [25]
Изменение и модернизация
Из мира железа [27]
Компьютерное Железо
Из мира софта [216]
Программы, софт, ПО
Вирусы и антивирусы [33]
Вредоносные проги, антивирусы
Сети и всё о них [10]
Сети, технологии, топологии, интернет
Статистика сайта [3]
Статистика сайта, лучшие статьи, лучшие новости, популярность материалов
Статьи [14]
Полезная информация
Обучение

БГТУ Им. Шухова




Информационное


Компьютерные
преступления
Неправомерный доступ к компьютерной информации
Создание, использование и распространение вредоносных программ для ЭВМ
Нарушение правил эксплуатации ЭВМ, системы ЭВМ или их сети.
Нарушение авторских и смежных прав
Компьютерный юмор
101 Причина, Почему Вы не можете Найти Вашего Сисадмина
Админы и программеры
Раз в жизни каждый сисадмин делал это...
Антивирусы - Бойцы Системы
Как сэкономить на компьютере?
Как сломать систему windows или вывести её из строя
Интересные фото компьютеров
Самые прикольные мобильные телефоны (фото)
Опрос
Скажите пожалуйста, что вам НЕ нравится в моём интерфейсе (дизайне) сайта ?
Всего ответов: 41
Пожертвуй сайту
Яндекс Деньгами на счёт
41001890037109 руб.


WebMoney на кошелек
Z356613988370
WMZ

Подробнее...

Практический пример. Показ содержимого директории.

Реализуем в данном примере возможность показа содержимого директории. Данная программа при запуске показывает содержимое текущей директории. Для перехода в другую директорию нужно ввести команду cd.Примеры: cd C:\\MyPictures ( покажет содержимое каталога C:\\MyPictures); cd C:\Games\3DKitchen ( покажет содержимое каталога C:Games3DKitchen);cd .. ( покажет содержимое родительского каталога и перейдет в него); cd ( покажет содержимое текущего каталога);cd . ( покажет содержимое текущего каталога);. Для выхода из программы нужно ввести exit  . Для перехода в корневой каталог необходимо ввести команду root. (Все вышеперечисленные команды регистронезависимы)..

Ввод-вывод в языке С++.

Средства ввода/вывода не входят непосредственно в язык С++, поэтому библиотека ввода/вывода становится одной из самых незаменимых при программировании на С++.

На протяжении многих уроков, используя директиву препроцессора include мы подключали к нашим программам заголовочный файл iostream.h. Его назначение - связать компилируемую программу с одной из основных частей бибилотеки ввода/вывода, построенной на основе механизма классов.

Потоки ввода-вывода.

Описанные в файле iostream.h средства ввода-вывода обеспечивают программиста механизмами для извлечения данных из потоков и для включения (помещения) данных в потоки.

iostream.h: stream - поток, "i" - сокр. input - ввод, "o" - сокр. output - вывод.
Поток определяется как последовательность байтов (символов) и с точки зрения программы не зависит от устройств, с которыми ведется обмен данными (файл на диске, принтер, клавиатура, дисплей и т.п.).

При обмене с потоком часто используется вспомогательный участок основной памяти - буфер потока.

В буфер потока помещаются выводимые программой данные перед тем, как они будут переданы внешнему устройству. При вводе данных они вначале помещаются в буфер и только затем передаются в область памяти выполняемой программы. Использование буфера повышает скорость передачи данных, т.к. реальные пересылки осуществляются только тогда, когда буфер уже заполнен (при выводе) или пуст (при вводе).

Используемые в программе потоки логически делятся на входные, из которых читается информация, выходные, в которые вводятся данные и двунаправленные, допускающие как чтение, так и запись.

Чтобы можно было использовать потоковые классы, а соответственно, их данные и методы необходимо включить в программу нужный заголовочный файл:
iostream.h - для классов ios, istream, ostream, stream;
fstream.h - для классов ifstream, ofstream, fstream;
Так как класс ios является базовым для остальных потоковых классов, то включение в текст программы файла fstream.h автоматически подключает к программе файл iostream.h.

Предопределенные потоки.

Библиотека ввода-вывода имеет 4 предопределенных объекта-потока, ассоциированных со стандартным вводом и выводом:
cin - объект класса istream, связанный со стандартным буферизированным входным потоком (обычно с клавиатурой);
cout - объект класса ostream, связанный со стандартным буферизированным выходным потоком (обычно с дисплеем);
cerr - объект класса ostream, связанный со стандартным небуферизированным выходным потоком (обычно с дисплеем), в который направляются сообщения об ошибках;
clog - то же, что cerr, но буферизирован.

Каждый раз при включении в программу файла iostream.h происходит формирование объектов cin, cout, cerr и clog, т.е. создаются соответствующие стандартные потоки, и программисту становятся доступными связанные с ними средства ввода-вывода.

Операции помещения в поток и извлечения из потока.

Библиотека потоков С++ предусматривает два основных класса для ввода и вывода: istream и ostream. Класс ostream использует для вывода переопределенную операцию левого сдвига (<<), которую называют операцией помещения в поток. Класс istream использует для ввода переопределенную операцию правого сдвига (>>), которую называют операцией извлечения из потока.

Операции помещения и извлечения допускают сцепленные вызовы, т.к. возвращают значение ссылки на поток. Классы istream и ostream перегружают операции помещения и извлечения для всех встроенных типов данных. Такая перегрузка позволяет использовать единый синтаксис для ввода и вывода символов, строк, целых и вещественных чисел. Операции помещения/извлечения можно легко распространить на пользовательские типы данных. Для этого надо определить две функции со следующими заголовками (вспоминайте материал предыдущих занятий, тема "Перегрузка операторов"):

istream& operator >> (istream&, имя_типа&);
ostream& operator << (ostream&, имя_типа&);
Определяя операции помещения/извлечения для классов, их обычно делают дружественными, чтобы обеспечить доступ к закрытым элементам данных класса.

Файловый ввод-вывод с применением потоков.

В программах, которые мы писали до сих пор, вся информация, вводимая в процессе работы программы, терялась по окончании работы. Такие программы используются редко. Обычно одна и та же информация используется многократно в течении длительного времени. Для многократного использования информации ее записывают на диск в виде файла. Файлом можно назвать объект с именем, доступ к которому поддерживает (обеспечивает) операционная система. Поддержка операционной системы состоит в том, что в ней имеются средства:

  • создания файлов,
  • уничтожения файлов,
  • поиска файлов на диске (дискете и т.д.),
  • чтения и записи данных из файлов и в файлы,
  • открытия файлов,
  • закрытия файлов
  • и др.
Библиотека ввода-вывода С++ включает средства для работы с последовательными файлами.

Логически последовательный файл можно представить как именованную цепочку байтов, имеющую начало и конец. С помощью средств библиотеки можно осуществить следующие процедуры: создание файла, создание потока, открытие файла, "присоединение" файла к потоку, обмен с файлом с помощью потока, "отсоединение" потока от файла, закрытие файла, уничтожение файла. Кратко рассмотрим наиболее простые и удобные механизмы указанных действий.

Как уже отмечалось, библиотека потоков содержит три класса, предназначенных для ввода и вывода в файлы:

  • ofstream - для вывода (записи) данных в файл; (наследник ostream)
  • ifstream - для ввода (чтения) данных из файла; (наследник istream)
  • fstream - для чтения и для записи данных (двунаправленный обмен, наследник iostream).
Эти классы наследуют все особенности потоковых классов. Чтобы использовать эти классы, в текст программы необходимо включить заголовочный файл fstream.h. Тогда в программе можно будет определять конкретные файловые потоки, соответствующих типов (объекты классов ofstream, ifstream, fstream).

Конструкторы файловых потоков.

Если Вы посмотрите, как описаны классы ifstream, ofstream, fstream, обратите внимание на перегруженные конструкторы (для каждого из файловых классов предусмотрено 4 конструктора), например, наиболее используемые из них:

имя_класса ();
имя_класса (char*, int, int, int);
и т.п.
Например, для класса fstream:
fstream() - создает поток, не открывая файла;
fstream(const char* name, // имя файла
int omode, // режим открытия
int = filebuf::openprot // защита файла
) - создает поток, открывает файл и связывает его с потоком;
fstream( int f // дескриптор файла
) - создает поток и связывает его с уже открытым файлом
fstream( int f,
char *buf, // буфер
int len // размер буфера
) - то же, что предыдущий конструктор, но потоку назначается буфер.

Например, определение файловых потоков, используя конструкторы по умолчанию:

ofstream outf; // определяется выходной файловый поток
ifstream inf; // определяется входной файловый поток
fstream iof; // определяется файловый поток для ввода и вывода
Параметр omode - дизъюнкция флагов, определяющих режим работы с откываемым файлом (например, только запись). Флаги определяются в файле ios.h (см. перечислимая константа open_mode).
enum open_mode { 
in = 0x01, // открыть только для чтения
out = 0x02, // открыть только для записи
ate = 0x04, // установить указатель на конец файла
app = 0x08, // дописывать данные в конец файла
trunc = 0x10, // усечь файл до нулевой длины
nocreate = 0x20, // если файл не существует, ошибка открытия
noreplace = 0x40, // если файл уже существует, ошибка открытия
binary = 0x80 // открыть файл для двоичного обмена
};
Для файла ifstream по умолчанию параметр omode = ios::in, для класса ofstream по умолчанию параметр omode = ios::out.

Функции для открытия и закрытия файлов.

Создание файлового потока (объекта соответствующего класса) связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока. Так как файловые классы являются производными от классов ostream, istream, stream, то они поддерживают форматированный и бесформатный обмен с файлами. Но прежде чем выполнить обмен, необходимо открыть соответствующий файл и связать его с файловым потоком.

"Присоединить" файловый поток к конкретному файлу можно с помощью компонентной функции open(). Функция open() унаследована каждым из файловых классов ofstream, ifstream, fstream от класса fstreambase. Формат функции (такой же, как у второго конструктора fstream):

void open(const char *fileName, int mode = значение_по_умолчанию,
int protection = значение_по_умолчанию);

fileName - имя уже существующего или создаваемого заново файла. Это строка, которая задает полное или сокращенное имя файла в формате, определенном операционной системой.

Как обычно вызов функции open() осуществляется с помощью уточненного имени

имя_объекта_класса.вызов_принадлежащей_классу_функции
Например,
outf.open("d:\temp\file1.txt");
inf.open("file2.txt");
iof.open("file3", ios::app);
Чтобы проверить, удачно ли завершена функция open(), используется перегруженная операция !. Если ошибок не было, то выражение !имя_потока имеет нулевое значение, в противном случае - значение, отличное от нуля.
// ...
if (!inf)
{
cout << "Can't open! ";
return;
}

// ...
Для потоков класса fstream второй параметр должен быть задан явно, так как иначе неясно в каком направлении предполагается выполнять обмен с потоком.

Все файловые классы унаследовали от базовых классов функцию close(), которая очищает буфер потока, отсоединяет поток от файла и закрывает файл. Функцию close() необходимо явно вызывать при изменении режимов работы работы с файловым потоком. Автоматически эта функция вызывается только при завершении программы.

Функции для обмена с потоками.

Кроме операций помещения в поток и извлечения из потока, в классах библиотеки ввода-вывода есть весьма полезные функции, обеспечивающие программиста дополнительными средствами для обмена с потоками.

Бесформатный ввод и вывод. Бесформатный ввод и вывод обеспечивают наибольшую скорость обмена информацией. Для него предназначены следующие функции.

Чтение блока символов:
istream& istream::read(unsigned char *buf, int len);
istream& istream::read(signed char *buf, int len);
len - максимальное число символов, которые должны быть извлечены из потока в буфер buf. Истинное количество извлеченных символов возвращает функция gcount().
Запись блока символов:
ostream& osteram::write(const unsigned char *buf, int n);
ostream& osteram::write(const signed char *buf, int n);
n - число символов, считая ноль-символ, которые должны быть помещены в поток из буфера buf.
Извлечение одного символа из потока:
int istream::get();
istream& istream::get(unsigned char&);
istream& istream::get(signed char&);
Помещение одного символа в поток:
ostream& ostream::put(char);
Извлечение строки из потока:
istream& istream::get(unsigned char *buf, int n, char c = 'n');
istream& istream::get(signed char *buf, int n, char c = 'n');
Символы извлекаются и помещаются в буфер пока не будет найден символ-ограничитель, или не будет прочитано n символов, или не встретится конец файла. Ограничитель из потока не извлекается и в буфер не помещается. В противоположность функция getline, которая выполняет то же, что и get, но ограничитель извлекается из потока (в буфер не заносится).
istream& istream::getline(unsigned char *buf, int n, char c = 'n');
istream& istream::getline(signed char *buf, int n, char c = 'n');
Часто применяемые функции потока.

Пропуск символов при вводе.
istream& istream::ignore(int n = 1, int d = EOF);
извлекает символы из потока, пока не встретится ограничитель d или пока не извлечет n символов.
Проверка счетчика извлечения.
int istream::gcount();
- возвращает число символов, извлеченных последней функцией бесформатного ввода.
"Заглядывание" вперед.
int istream::peek();
- позволяет "взглянуть" на очередной символ входного потока - возвращает код следующего символа потока (или EOF, если поток пуст), но оставляет этот символ в потоке. При необходимости этот символ можно извлечь из потока с помощью других средств библиотеки.
Возврат символа в поток.
istream& istream::putback(char cc);
- не извлекает ничего из потока, а помещает в него символ cc, который становится текущим и будет следующим извлекаемым из потока символом.
Позиционирование потока.
istream& istream::seekg(long pos);
- устанавливает позицию чтения из потока в положение, определяемое значением параметра.
istream& istream::seekg(long off, ios::seek_dir dir);
- выполняет перемещение позиции чтения вдоль потока в направлении, опеределенном параметром dir, который принимает значение из перечисления enum seek_dir {beg, cur, end};. Относительная величина перемещения ( в байтах) определяется значением параметра long off. Если направление определено как beg, то смещение от начала потока; cur - от текущей позиции; end - от конца потока.
ostream& ostream::seekp(long pos);
- устанавливает абсолютную позицию записи в поток.
ostream& ostream::seekp(long off, ios::seek_dir dir);
- аналогична функции seekg(), но принадлежит классу ostream и выполняет относительное перемещение записи в поток.
Определение текущей позиции потока.
long istream::tellg();
- определяет текущую позицию чтения из потока.
long ostream::tellp();
- определяет текущую позицию записи в поток.

Интересные статьи
недавно добавленные
Меняем местами C и D или как поменять букву логического диска

Решение проблемы со шрифтами в Windows XP|Vista/7

Как правильно выбрать прошивку для DSL-2500U

Инструкция по обновлению прошивки для ADSL-модемов

Cерьезные дефекты в струйных принтерах

Несколько мифов о HDD

Блокировка одноклассники, вконтакте

Mac OS vs. Windows

РЕШЕНО! Активация Windows XP

В чем отличие между Annex A и Annex B ?

Удаление Баннеров + Разблокировка Windows

При входе в систему происходит

Интернет и ADSL

Как правильно подключить ADSL splitter

Что такое точка доступа Wi-Fi и беспроводной роутер

Ищем и устраняем проблемы лазерной печати

SVCHOST.EXE и распространенные признаки работы вирусов

Ошибка программы установки устройства Volume

Все статьи...
Релама от Begun


Программное
обеспечение
Коммуникация и связь - (5)
Офисные приложения - (134)
Звук - (119)
Антивирусное ПО - (302)
Медиа - (685)
Утилиты - (2085)

Все проги...
Партнеры и счетчики


Образовательный сервис ИнфоКонсалтинг

Каталог@Mail.ru - каталог ресурсов интернет


Наша Кнопка


Онлайн радио
Поиск для гостей
Другая статистика