Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 63569
Модуль Forms 63394
ТЕХНОЛОГИИ ДОСТ... 60179
Пример работы с... 59280
Имитационное мо... 55618
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

Пользователей: 13,078
новичок: codepro
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование ЭВМ на GPSS (три класса заданий) + Пояснительная записка
Моделирование процесса обработки заданий пакетным режимом работы с квант...
База данных - словарь терминов на Delphi + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Широкие файловые потоки
Использовать широкие текстовые потоки для работы с текстовыми файлами не представляет труда. Напишем вариацию на тему примера из листингов 14.3 и 14.4 (листинг 14.26).

Листинг 14.26. Текстовые файлы с широкими текстовыми потоками
#include <fstream>
#include <iostream> // требуется в Visual С++.NET 2003
#include <ctime>
using namespace std;
// функция копирования файлов
void filecopy (wifstream &in, wofstream &out)
{ wchar_t ch;
while(in.get(ch)) // читать все символы, в том числе пробельные
out.put(ch);
}
int main()
{ srand((unsigned)time(NULL)); // датчик случайных чисел
wofstream strm; // выходной поток-объект
strm.open("c:/textfiles/woonumber.txt"); // открываем
if (strm.is_open()) // проверка открытия
{ for(int i = 0; i < 10; i++)
strm << rand()%10 << endl; // выводим 10 чисел
strm.close(); // закрываем выходной поток-файл
// суммирование чисел записанных в файле
// открываем тот же текстовый файл для чтения
wifstream strm("с:/textfiles/woonumber.txt");

if (strm)
{ int number, summa = 0, count = 0; while(strm >> number) { ++count;
summa+=number;

// проверка открытия
// ввод числа
// подсчет количества
// суммирование



wcout << summa << L"; strm.closeO ;

<< count;

// вывод результатов // закрываем поток-файл

}
} s
wifstream instrm ("c:/textfiles/woonumber.txt");
wofstream outstrm("c:/textfiles/woonumber.new");
if (instrm) filecopy(instrm, outstrm); // копирование файлов
instrm.closeO; // закрываем файлы
outstrm.closeO ; return EXIT_SUCCESS;
}



Сначала программа объявляет широкий поток strm, который при открытии связывается с текстовым файлом woonumber.txt. Затем в файл выводятся 10 случайных чисел, и поток закрывается. На этой стадии в нашем каталоге TextFiles можно обнаружить текстовый файл размером 30 байт. Далее тот же файл открывается как входной, числа читаются и суммируются — все работает точно так же, как и в примере из листинга 14.3. Затем существующий файл копируется с помощью функции копирования f i lecopy (), параметрами которой являются широкие потоки. На этой стадии программы в каталоге TextFiles можно увидеть 2 файла: woonumber.txt и woonumber.new.
Широкие потоки в функции fi lecopy () использовать совершенно необязательно — вполне корректно работают и обычные, открытые в двоичном режиме:
ifstream instrm ("с:/textfiles/woonumber.txt", ios::binary); ofstrjeam outstrm("c:/textfiles/woonumber.new", ios::binary);



При этом не происходит преобразования формата символа новой строки '\п\ То есть считывание и запись можно выполнять побайтно — независимо от того, сколько и каких байтов в файл записано.
Размеры файлов показывают, что символы-цифры выводятся в «широкий» файл в однобайтовом виде. Это, кстати, явно указано в стандарте (см. п. п. 28.8.1/2 в [1]). Проверим, как выводятся широкие символы латиницы и кириллицы. Для этого создадим два широких выходных файловых потока. Для «чистоты» эксперимента установим для одного из них русский контекст и выведем в поток русскоязычную и англоязычную константу. Для второго потока контекст устанавливать не будем. Добавим в конец предыдущего примера следующие строки:
wofstream rstrm("c:/textfiles/woorussian.txt"); rstrm.imbue(locale("rus_rus.866"));
rstrm << 1_"Проверка вывода русских букв в файл" << endl; rstrm << L"aaaaaaaa www rrrrrrr cccc i ffff" << endl; rstrm.closeO ;




Программа работает совершенно одинаково и в Visual C++.NET 2003, и в С++ Builder 6.
wofstream estrm("c:/textfiles/wooenglish.txt");
estrm << L"aaaaaaaa vvvvvv rrrrrrr cccc i ffff" << endl;
estrm << 1_"Проверка вывода русских букв в файп" << endl; // не выводятся
estrm.close();



И в «русский»^ и в «английский» потоки символы выводятся в однобайтной кодировке. Если русский контекст не установлен, то буквы кириллицы просто не выводятся в файл — как и все остальные символы, расположенные следом!
Ничего не меняется, если мы используем вместо широкой константы-строки широкую переменную:
wstring ws = !_"Проверка вывода русских букв в файп"; rstrm << ws << endl;



Размер русскоязычной строки в файле остается тем же самым.
ПРИМЕЧАНИЕ
Если широкие потоки, связанные с текстовыми файлами, работают правильно, то при связывании их с двоичными файлами возникают малопонятные проблемы. Во всяком случае, и в Visual C++.NET 2003, и в С++ Builder 6 методы read() и write() для широких потоков работают неправильно.

Резюме
Ввод-вывод в С++ основан на концепции потоков, которые были реализованы еще в С в библиотеке <stdio.h>. Библиотека <iostream> предоставляет объектно-ориентированную реализацию потоков. Объектно-ориентированный подход надежнее и проще в использовании.
В С++ реализован достаточно богатый набор средств ввода-вывода: стандартные консольные потоки, строковые потоки, файловые потоки. Объектно-ориентированные потоки более универсальны, чем процедурные, и «умеют» работать со строками типа string.
Для ввода-вывода информации в библиотеке перегружены операции сдвига влево и вправо. Кроме того, реализовано множество методов обмена данными между программой и потоком. В объектно-ориентированной библиотеке реализовано значительное количество средств форматирования: флаги, манипуляторы и методы. Все средства форматирования работают единообразно для всех видов потоков: стандартных, строковых и файловых.
Объектно-ориентированные средства ввода-вывода являются расширяемыми, то есть мы можем создавать собственные средства форматирования на основе стандартных. Перегрузка операций ввода и вывода обеспечивает их единообразный вид как для встроенных типов, так и для реализованных классов.
Строковые потоки являются универсальным средством преобразования чисел в строки и обратно. Строковые потоки бывают входными, выходными и двунаправленными. Для строковых потоков работают методы, обеспечивающие произвольный доступ к любому байту потока.
Опубликовал Kest May 29 2014 15:09:38 · 0 Комментариев · 2230 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
PHP: настольная к...
Исправление проц...
IPAddresseEdit
39 статьи по Delphi
Animation Effect ...
Halcyon
PHP глазами хакера
NotePad Pro [Исхо...
FilesInfo
RAS
Расширенный загру...
Основы программир...
Архив программ
iChat v.7.0 Final...
Swat [Исходник на...
Панель случайной ...
Как программирова...
PHP 5 на примерах
NetGraph [Исходни...
База игр

Топ загрузок
Приложение Клие... 100444
Delphi 7 Enterp... 85618
Converter AMR<-... 20065
GPSS World Stud... 12472
Borland C++Buil... 11525
Borland Delphi ... 8480
Turbo Pascal fo... 7020
Visual Studio 2... 4987
Калькулятор [Ис... 4727
FreeSMS v1.3.1 3533
Случайные статьи
Главная идея Томпсона
ENTER (ВОЙТИ В ПАМ...
Фрикинг телефонных...
Мониторинг входящи...
Контроллер
НЕПОДВИЖНАЯ ТОЧКА....
Это предотвратит у...
Интерпретация данн...
Определение вторич...
Основная особеннос...
Итератор для после...
2.5. Арифметика
Microsoft Word 2007
Волновой алгоритм ...
Безопасность
Что содержит конфи...
Операции. Операции...
Canon: выбор атмос...
consult(X)
Абстрактные классы
Способ проведения ...
Реализация сеансов...
Билеты
Сжатие данных
Компиляция в MIPS-...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?