Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 25
На сайте нет зарегистрированных пользователей

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

Моделирование процесса обработки заданий пакетным режимом работы с квант...
База данных студентов на 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 Комментариев · 3309 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Игра "Астероиды" ...
Форма в форме
Профессиональное ...
Plasma
Пример создания W...
Пример работы с р...
CaptionButton
Факториал [Исходн...
В.Понамарев - COM...
Apollovcl61
C++ для начинающих
Создание лабиринт...
Длинный заголовок...
AlnComponents
CoolDev TipsSyste...
PDJPack
Domen Name IP
Современное проек...
TmxOutlookBarPro
PDJ Scrollers

Топ загрузок
Приложение Клие... 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
Случайные статьи
Вызов хранимых про...
Видео в Интернете ...
распределенной сети
Преобразование теп...
на диске RAID-1
Эппель обрабатывал...
Продвижение инфогр...
UNIX предъявляет р...
Работа с форматом ...
Внимание - за вам...
Сайты для обмена и...
Измерение длительн...
Играть в казино он...
ОЧЕРЕДИ В GPSS
Компоненты доступа...
В словаре, который...
МИФЫ О НОРМАЛИЗАЦИИ
Более того, для ко...
Как запускать прог...
Типичные размеры в...
Функциональный модуль
Мумие алтайское
Процедура InitGrap...
Непосредственное в...
функции AddDetails
Статистика



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


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