Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2012, 21:35   #1
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию Unicode-обертка над std::stream

Собственно, хочется иметь некий класс, который умеет распознавать и кодировать/декодировать юникод, и чтобы ему можно было указать низлежащий входной/выходной поток. Т.е. что-нибудь в духе:
Код:
UnicodeStream us(std::ifstream("unicode_text.txt")); // поток для чтения unicode из файла
UnicodeStream us2(std::cout); // поток для вывода unicode-данных в стандартный вывод
Собственно, по значению внутренний поток не похранишь. Принимать по указателю? Коренным образом что-то менять? Какие есть идеи?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 15.12.2012, 02:13   #2
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Для этих целей используй UNICODE-версии.
Код:
std::wcout
std::wifstream
Посмотри такой вариант.
Код:
#include <iostream>
#include <fstream>

class out_stream {
private:
        std::wostream* hout;
public:
        out_stream(void){}
        out_stream(std::wostream& _out) {
            hout = &_out;
        }

        void write(const wchar_t* s) {
              (*hout) << s;
        }
};


int main(void)
{
    out_stream om(std::wcout);
    om.write(L"Hello Console !!!");

    std::wofstream fp("text.txt");
    out_stream of(fp);
    of.write(L"Hello File !!!");
    fp.close();
    return 0;
}
Nuklon вне форума Ответить с цитированием
Старый 16.12.2012, 19:09   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Насколько я знаю, wide версии потоков отличаются лишь тем, используют wchar_t вместо char. Я хотел написать ручное распознавание и декодирование utf8, utf16 и utf32, но суть не в этом.

Код:
class out_stream {
private:
        std::wostream* hout;
public:
        out_stream(void){}
        out_stream(std::wostream& _out) {
            hout = &_out;
        }

        void write(const wchar_t* s) {
              (*hout) << s;
        }
};
Этот подход плох тем, что если объект, на который мы ссылаемся, будет уничтожен, класс перестанет работать.

Может быть, сделать шаблонный метод в духе такого
Код:
class UnicodeOStream
{
private:
    std::ostream * _out;
public:
    template <typename Stream, typename ... Args>
    void openStream (Args ... args)
    {
        _out = new Stream(std::forward<Args>(args)...);
    }
    ~ UnicodeOStream ( )
    {
        delete _out;
    }
};
Есть у кого-нибудь более красивые идеи?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.12.2012, 19:57   #4
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Этот подход плох тем, что если объект, на который мы ссылаемся, будет уничтожен, класс перестанет работать.
я конечно может не то думаю, а почему бы не создать копию объекта.
что бы класс имел свой собственный на основе другого.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 16.12.2012, 20:31   #5
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Сообщение от Perchik71
а почему бы не создать копию объекта.
Изначально так и хотел, но потоки не позволяют себя копировать.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.12.2012, 23:24   #6
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

хмм........ ну допустим...
а если создать поток в классе.....
после чего из того потока "высосать" содержимое, записать в новый и установить позицию ровно там же как и там?.. т.е. предлагаю самому реализовать метод копии.
//--------
неее скорее так не покатит..... у консоли свой поток... новый она не стерпит.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 16.12.2012 в 23:28.
Perchik71 вне форума Ответить с цитированием
Старый 17.12.2012, 00:41   #7
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Сообщение от Perchik71
...после чего из того потока "высосать" содержимое, записать в новый и установить позицию ровно там же как и там?.. т.е. предлагаю самому реализовать метод копии.
Это совсем беда. Я ведь понятия не имею сколько, а важнее - когда считывать.

Цитата:
Сообщение от Perchik71
а если создать поток в классе.....
Примерно так я и предложил сделать, но не знаю, плохо это или хорошо.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 17.12.2012, 07:07   #8
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Примерно так я и предложил сделать, но не знаю, плохо это или хорошо.
Я думаю плохо..... например новый поток, по идеи не выведет на консоль, что либо. с чисто обычных соображений. ибо это новый объект и он не как не связан с std::wcout. ровно так же дела пойдут и с файлом.... а если даже как то удастся, то тут нужно подумать о синхронизации двух потоков... это будет очень хорошо видно на теме файлов.... я ввёл одно там, а в этом так... что будет в таком случаи?
//-----
а так же интересный момент... если я закрыл поток файла...
думаю это не удачная затея..... проще отследить верность указателя.
объект что тебе советовали выше.. лучшего не найдёшь.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 17.12.2012 в 07:14.
Perchik71 вне форума Ответить с цитированием
Старый 17.12.2012, 11:14   #9
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Perchik71, с std::cout как-нибудь справлюсь, а вот почему должна возникнуть проблема с файлами? Я просто делаю так
Код:
UnicodeOStream file;
file.openStream<std::ifstream>("file.txt");
И все отлично, поток создается внутри в единственном экземпляре.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 18.12.2012, 21:31   #10
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Perchik71, с std::cout как-нибудь справлюсь, а вот почему должна возникнуть проблема с файлами? Я просто делаю так
Код:
UnicodeOStream file;
file.openStream<std::ifstream>("file.txt");
И все отлично, поток создается внутри в единственном экземпляре.
в данном случаи я говорю о копировании... в вашем примере да 1 экземпляр, я говорю если их реализовать отдельно...

проблема в том, что должна выйти ошибка I/O как защита от записи ибо файл при открытии будет конфликтовать... я рассуждаю с точки зрения 2 объектов.. ведь класс ваш хранит инфу об потоке, который может использоваться извне. с объектом проблем не будет. но защиту от дураков... лучше организовать.

может попробуете создать перечень конструкторов, которые сами генерируют то, что вам нужно? в поток впихать можно всё. вопрос лишь что именно. а перегруженные конструкторы (обилие) поможет в этой проблеме, вот только сам объект как бэ внутри конструктора создаёться... а не пользователем... его нужно ограничить.. как дурака.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Flash-обертка для управления звуком Zer0 Фриланс 0 13.08.2012 13:19
E2015 Ambiguity between 'std::log(double)' and 'std::log(long double)' Namolem Помощь студентам 3 02.04.2011 20:22
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
Variant to Stream & Variant from Stream Oreol Общие вопросы Delphi 1 24.03.2009 13:14
Socket vs Stream JoanM Работа с сетью в Delphi 1 01.04.2008 10:10