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

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

База данных - рабочее место кассира на Delphi + бд Access
Изменения контуров и сортировка в двумерном массиве чисел на Turbo Pasca...
Моделирование системы управления качеством производственного процесса на...

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

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Программа для рис...
Java в примерах -...
AUTOWEB
Программирование ...
45 уроков по дельфи
Панель Календарь
PolyFlow
Pirc
С. Г. Горнаков - ...
TelBook
DCAVI
Анекдоты с ostrie.ru
Сапёр
Определние размер...
Панель для реклам...
ИНТЕРНЕТ ПРОГРАММ...
Х. М. Дейтел, П. ...
XPmenu
Работа с матрицами
Flash MP3 Player ...

Топ загрузок
Приложение Клие... 100795
Delphi 7 Enterp... 98041
Converter AMR<-... 20299
GPSS World Stud... 17061
Borland C++Buil... 14250
Borland Delphi ... 10377
Turbo Pascal fo... 7393
Калькулятор [Ис... 6084
Visual Studio 2... 5236
Microsoft SQL S... 3674
Случайные статьи
Квартир оценка
Пишем троян
ЦЕЛЬ: ХРАНЕНИЕ МНО...
5. КОС отсылает эт...
Способы фильтрации...
Аналоговые и цифро...
Разделение списка
Установка и удален...
Логическое «НЕ»
Списки приборов
Сегментирование кл...
Правильная настрой...
Карта CLEAR
Давайте рассмотрим...
Азино Три Топора -...
10.1. Ключ к успех...
Внимание к ключево...
Предварительная по...
Изменение уровня т...
Декодер для адапти...
решения для выделе...
Ставки на киберспо...
Type Identifier ex...
Rox Casino
Важные замечания п...
Статистика



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


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