Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 22
На сайте нет зарегистрированных пользователей

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

Двунаправленный динамический список на Delphi + Блок схемы
Метод конечных разностей для интерполяции/экстраполяции на Delphi
База данных студентов на Delphi (файл записей) + Блок схемы

Широкие файловые потоки
Использовать широкие текстовые потоки для работы с текстовыми файлами не представляет труда. Напишем вариацию на тему примера из листингов 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 11:09:38 · 0 Комментариев · 3312 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
В.Понамарев - COM...
Простой пример ка...
Язык программиров...
Применение жадног...
Microsoft Press -...
Delphi и технолог...
Эффект лампы на р...
Rss Parser
VksButton
Программирование ...
BDEPack
EMS QuickExport S...
Киллер окон
Игра в крестики н...
45 уроков по дельфи
DeleteEdit
RAS
PHP глазами хакера
ScreenSaver [Исхо...
Degisy Data Acces...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97839
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14193
Borland Delphi ... 10293
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Пример создания та...
Онлайн-казино Eldo...
Коллекция параметров
Представления дере...
Динамическая компо...
Translucent File S...
Команда SELECT
Будьте на виду сле...
Записать в резиден...
Аудит беспроводной...
Инфографические ре...
7.5. Принципы
Acompli и почта
административных г...
Как маршрутизатор ...
расположенному в ч...
Регистры последова...
Литература
Добавление в проек...
TERMINATE (ЗАВЕРШИТЬ)
3.1. Дополнительна...
Задача №3. Необход...
В объекте DataSet
подкаталог Ех73
Как избавиться от ...
Статистика



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


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