Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

генератор пароль + система "аккаунтов" ...

44K
25 апреля 2010 года
mlt^^
63 / / 01.04.2010
Доброго всем времени суток. В учебных целях (и целях собственного удовлетворения) взялся написать программу. Суть программы - библиотечный каталог, т.е. необходимо реализовать систему уровней доступа (администратор (библиотекарь) и пользователь (читатель)) с доступом к базе, где будут храниться данные (предварительно - список людей и взятые ими книги/сроки сдачи и тд ...). Необходимы советы по написанию 2 алгоритмов:
1. Система "аккаунтов". То есть регистрация (администратора регестрировать не надо, только пользователи) и доступ к личному "кабинету" путем ввода логина и пароля.
2. Генерация пароля. Учитель поставил задачу - сделать так, чтобы пароль для аккаунта при регистрации выдавался автоматически, соответчтвенно хотелось бы сделать что-нибудь хорошее, на эту тему.

Программу буду писать на с++ под дос, чтобы особо не гемороиться с win32 приложением ибо пока только начал это дело изучать.
У кого есть какие то соображения на эту тему - было бы неплохо их услышать....
Спасибо за внимание -)
Страницы:
307
25 апреля 2010 года
Artem_3A
863 / / 11.04.2008
ну надо типа зашифрованную бд, в твоем случае, наверное, это будет бинарный файл. хранишь в нем логин, пароль, тип пользователя. бд шифруешь гаммированием, гамму строго вобьешь в приложение. в бд пароли в явном виде лучше не хранить, посоветовал бы тебе реализовать хеширование, если слишком сложно, то можно тоже гаммировать. относительно генерации пароля, определяешь множество допустимых символов в пароле, и рандомом генеришь каждый символ пароля, при этом следя дабы сгенерированный символ входил в допустимое множество, ну это в случае если множество разрывное, если нет, то просто генеришь на допустимом интервале. пароли лучше сделать переменной длинны, тогда надо определить минимальную длину, и генерить так же рандомно длину для текущего пользователя более минимальной. при входе пользователя в систему, дешифруешь базу, ищешь пользователя по логину, приводишь введенный пароль в шифрованный вид(гаммируешь, хешируешь), сравниваешь шифрованный пароль из бд с паролем введенным.
ну вот, как бы, в общих чертах твоя игрушечная система защиты.

зы: гуглить "гаммирование", "хеширование", "рандомизатор с++".
44K
24 мая 2010 года
mlt^^
63 / / 01.04.2010
Ещё один вопрос на эту к этой программе:
Как я буду реализовывать саму базу данных:
у меня есть класс книга (автор, название, кол-во стр. и тд)
класс польхователей(имя, пароль)
Соответственно нужно сделать список книг чтобы например загружать его из файла, добавлять администратором новые книги, удалять и тд. Я хотел реализовать это с помощью контейнера какого-нибудь. Наприме set . Но так и не понял как.
Соответственно второй раз использовать контейнер, для того чтобы каждому польхователю соответствовало n-ое кол-во книг ....
44K
24 мая 2010 года
mlt^^
63 / / 01.04.2010
Блин, хоть убейте не понимаю как испольховать set. первый раз столкнулся с stl.
Сейчас попробую вкратце описать проблему:
имеется
Код:
class book
{
private:
    bk_id_t id;
    bk_author_t author;
    pchar_t title;
    bk_pgs_t pages;
public:
    book(bk_author_t _author, csz_t _title, bk_pgs_t _pages);
    bk_id_t get_id() const
    {
        return id;
    }
    friend bool operator == (book& bk1, book& bk2);
    friend bool operator < (const book& bk1, const book& bk2);
    friend std::ostream& operator << (std::ostream& stream, book& book_);
};

Код:
byte_t str_compare(const char * st1, const char * st2)
{
    unsigned short size_st1(str_len(st1)),size_st2(str_len(st2));
    unsigned short i(0),imax((size_st1<size_st2)?(size_st1):(size_st2));
    while(i<imax)
    {
        if(st1>st2)
            return 1;
        else
            if(st1<st2)
                return -1;
            else
                i++;
    }
    return 0;
}
...
bool operator < (const book& bk1, const book& bk2)
{
    if(str_compare(bk1.get_id(), bk2.get_id())>0)
        return true;
    else
        return false;
}


Код:
set<book> book_base;
    book bk1("ALina", "Kniga Pizdec!", 1030);
    book bk2("ALina", "Kniga Pizdec!", 1000);
    book bk3("Alesha", "Kniga Molodec!", 2500);
    book bk4("Petya", "Kniga Molodec!", 2500);

    book_base.insert(bk1);
    std::cout<<*(book_base.begin());
    system("pause");

    book_base.insert(bk3);
    std::cout<<*(book_base.end());

Вылетает при попытке добавить вторую книгу. Причём компилится нормально.
44K
24 мая 2010 года
mlt^^
63 / / 01.04.2010
Втопку, сделаю свою базу книг на векторе и сам буду всё делать ... с стл потом разберусь как-нибудь ... Ну или может тут подскажут ...
3
24 мая 2010 года
Green
4.8K / / 20.01.2000
А почему бы не использовать нормальные СУБД ?
Ну хотя бы sqlite...
297
24 мая 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: mlt^^

 
Код:
book_base.insert(bk3);
std::cout<<*(book_base.end());

Вылетает при попытке добавить вторую книгу. Причём компилится нормально.


Насколько я понимаю, вылетает не при добавлении второй книги, а при разыменовании индексатора, указывающего ЗА конец контейнера. Ведь end() указывает не на последний элемент, а ЗА него.
Вот так, вроде, будет последний элемент:

 
Код:
std::cout<<*(--book_base.end());

Конечно, это лишь пример (причём глупый).

Добавьте все книги в множество, и просмотрите их список:
 
Код:
for (set<book>::iterator iter = book_base.begin(); iter != book_base.end(); iter++)
    cout << *iter;
44K
24 мая 2010 года
mlt^^
63 / / 01.04.2010
А что должно быть определено для создания set ? Насколько я понимаю нужно оперделять оператор сравнения < ? И как обеспечить уникальность каждой "книги" в множестве ? Например у меня могут быть 2 разные книги но например с одинаковыми названиями (тут как бы сравниваются ключевые поля) как сделать так, чтобы книги не добавлялись или наоборот заменялись ? за это отвечает оператор < ?

По поводу реально СУБД использование запрещено. Ибо это обучающая программа на курс программирования (и метрологии) следовательно они типа смотрят как я сам это всё дело понимаю и реализую...
По поводу
44K
24 мая 2010 года
mlt^^
63 / / 01.04.2010
Цитата: koodeer
Насколько я понимаю, вылетает не при добавлении второй книги, а при разыменовании индексатора, указывающего ЗА конец контейнера. Ведь end() указывает не на последний элемент, а ЗА него.
Вот так, вроде, будет последний элемент
...


Нет вылетает именно при добавлении. Причем пишет типа invalid operator < ...

44K
25 мая 2010 года
mlt^^
63 / / 01.04.2010
Кстати ещё одна проблема: как читать\записывать в файл в бинарном режиме ?
то есть напрмиер у меня есть вектор из книг и я прям по одной книге хочу в файл закидать а потом n книг (n = размер файла / sizeof(book)) прочитать оттуда, при этом чтоб файл был не строкой а именно бинарный ...
открыть закрыть я полагаю надо типа
 
Код:
fstream file(file_, std::ios_base::binary); ... file.close();

А вот как кинуть в файл сам обьект ....
307
25 мая 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: mlt^^

А вот как кинуть в файл сам обьект ....



перегрузить оператор << и >>.

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

44K
25 мая 2010 года
mlt^^
63 / / 01.04.2010
ты прав, больше не буду постить сюда вопросы, которые я должен знать. я Всё-таки не тупой, просто ленивый. Кстати я не пью и не курю.
1
25 мая 2010 года
kot_
7.3K / / 20.01.2000
Цитата: mlt^^
Кстати я не пью и не курю.


"Лучше б он пил и курил..."(с) Сплин

3
25 мая 2010 года
Green
4.8K / / 20.01.2000
Интересно, что простые и гениальные мысли (т.е. мои) попросту пропускаются.
Зачем городить кривой трехколесный велосипед, если можно воспользоваться готовым, удобным и проверенным решением?
(Вопрос из праздного любопытства, я конечно же не отговариваю никого от бессмысленного творчества).
297
26 мая 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: mlt^^
А что должно быть определено для создания set ? Насколько я понимаю нужно оперделять оператор сравнения < ?


Да, для своего типа данных нужно определить свой operator <.

Цитата: mlt^^
И как обеспечить уникальность каждой "книги" в множестве ? Например у меня могут быть 2 разные книги но например с одинаковыми названиями (тут как бы сравниваются ключевые поля) как сделать так, чтобы книги не добавлялись или наоборот заменялись ? за это отвечает оператор < ?


Я так понимаю, у вас задание не использовать ничего стандартного, создать всё своё? Вон и типы данных свои, и функции определения длины строки, насколько я могу судить по названиям.

Не имея понятия о ваших типах данных, набросал пример, заменив их на стандартные.

Код:
#include<iostream>
#include<iomanip>
#include<string>
#include<set>
using namespace std;

class book
{
private:
    int id;
    string author;
    string title;
    int pages;
public:
    book(int _id, string _author, string _title, int _pages);
    int get_id() const
    {
        return id;
    }
    friend bool operator < (const book& bk1, const book& bk2);
    friend ostream& operator << (ostream& stream, book& book_);
};
book::book(int _id, string _author, string _title, int _pages):
id(_id), author(_author), title(_title), pages(_pages)
{
}
bool operator < (const book& bk1, const book& bk2)
{
    return bk1.author + bk1.title < bk2.author + bk2.title;
}
ostream& operator << (ostream& stream, book& book_)
{
    stream << left << setw(4) << book_.id;
    stream << book_.author << " '" << book_.title << "' " << book_.pages << endl;
    return stream;
}
void main()
{
    set<book> book_base;
    int id = 0;

    book_base.insert( book(id++, "ALina", "Kniga Pizdec!", 1030) );
    book_base.insert( book(id++, "ALina", "Kniga Pizdec!", 1000) );
    book_base.insert( book(id++, "Alesha", "Kniga Molodec!", 2500) );
    book_base.insert( book(id++, "Petya", "Kniga Molodec!", 2500) );

    for (set<book>::iterator iter = book_base.begin(); iter != book_base.end(); iter++)
        cout << *iter;
}

В данном примере одинаковыми считаются книги с одинаковыми авторами и названиями: за это отвечает условие bk1.author + bk1.title < bk2.author + bk2.title

Насчёт чтения/записи в файл. Не совсем ясно, что вы хотите: иметь возможность перезаписать любую книгу, не трогая остальной файл? Нет, так не получится, ведь размер данных о книге не фиксирован строго. Надо читать все данные из файла, удалять ненужные книги, добавлять новые, и по-новому записывать в файл.
1
26 мая 2010 года
kot_
7.3K / / 20.01.2000
Цитата: Green
Интересно, что простые и гениальные мысли (т.е. мои) попросту пропускаются.
Зачем городить кривой трехколесный велосипед, если можно воспользоваться готовым, удобным и проверенным решением?
(Вопрос из праздного любопытства, я конечно же не отговариваю никого от бессмысленного творчества).


твои генияльные и простые мысли мешают самоудовлетворятся топикстартеру - оттого безжалостно отбрасываются.
Кроме того, возможно у него задание - создать аналог БД - для изучения STL задача вполне. Помимо этого, я подозреваю, что ихний препАдователь вероятно прочел не так давно книжку одного афтора :) уж очень интересно похоже сформулирована задача.

44K
26 мая 2010 года
mlt^^
63 / / 01.04.2010
Спасибо koodeer за реальный пример использования множества ... Я теперь даже не знаю, что лучше использовать множество или вектор...
По поводу препода - его (а точнее её) задача научить нас понимать что мы делаем, а не чтоб тупо пользовались готовым. Да и просто я люблю всё делать через жопу, можно было ограничиться простым массивом book[1000], врядли этого было бы мало для учебных целей, вопрос в рациональности.... Про реальную БД тпиа sqllite я уже отвечал, что это курсовая такая "написать базу данных" за нее оценку поставят, чтож мне поставят если я скажу вот вам sql ставьте мне "отлично". ДА и самоудовлетвориться хочу, надеюсь в будущем хоть чуть чтуь по специальности поработать ...
3
26 мая 2010 года
Green
4.8K / / 20.01.2000
Ну так можно использовать STL и SQL совместно, каждая для своих целей.
А не STL в качестве SQL, а SQL в качестве STL. :)
44K
26 мая 2010 года
mlt^^
63 / / 01.04.2010
Всё-таки хорошо когда можно пообщаться с людьми ... Сейчас допишу окончательно свой класс книги и выложу сюда ^^ Буду флудить -)
Я уже говорил, что задача написать БД. Насколько я знаю (может ошибаюсь) sql это язык запросов к какой-то БД и 1. я не знаю этого языка. 2. в рамках данной задачи обращаться любым языком к любой другой базе нельзя, то есть пиши свою и точка (.)
Спасибо всем кто помогает =)
307
26 мая 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: mlt^^
Сейчас допишу окончательно свой класс книги и выложу сюда ^^ Буду флудить -)



а зачем? тут такого г... эм тварения уже и так хватает! %) 0_o :D

44K
26 мая 2010 года
mlt^^
63 / / 01.04.2010
Как лучше книгу записывать и считывать из файла ? (текстового)
чтоб каждое поле на отдельную строку клалось или чтоб все поля в 1 строку ?
Записать книгу в файл не проблема и так и так, а вот считать из файла - проблема ... особенно со строками (название или автор, если там пробелы есть) ...
307
26 мая 2010 года
Artem_3A
863 / / 11.04.2008
ты сам задал вопрос и сам на него ответил, на каждое поле новую строку!
44K
26 мая 2010 года
mlt^^
63 / / 01.04.2010
Возникает проблема считывания строки то есть например у меня в файле лежит
 
Код:
0
Avtor 1
Title 1
540
1
Avtor 1 & Avtor 5
Title 2
1440
...

Когда я считал первую строку : stream>>book.id;
начинаю считывать вторую std::getline(stream, book.author, '\n'); и она не считывается.
Видимо из за того, что после считывания id остается символ конца стркои в потоке, и когда начинаю считывать автора, сразу считывается тот '\n' и всё ... как это исправить ?

Записываю в файл я вот так вот :
 
Код:
std::ofstream& operator << (std::ofstream& stream, book& book_)
{
    stream<<book_.get_id()<<std::endl;
    stream<<book_.get_author()<<std::endl;
    stream<<book_.get_title()<<std::endl;
    stream<<book_.get_pages()<<std::endl;
    return stream;
}


Кстати есть задумка позволить в файл добавлять комментарии. Например если в строке первые два символа "//" то строку игнорировать и переходить к следущей...
307
26 мая 2010 года
Artem_3A
863 / / 11.04.2008
используй операторы >>. авторы и все прочие у тебя я так понимаю массив чаров? замени на стлевский стринг, будет удобней и проще!
44K
26 мая 2010 года
mlt^^
63 / / 01.04.2010
Авторы и названия у меня std::string/
Считываю я вот так вот :
 
Код:
std::ifstream& operator >> (std::ifstream& stream, book& _book)
{
    stream>>_book.get_id();
    stream>>_book.get_author();
    stream>>_book.get_title();
    stream>>_book.get_pages();
    return stream;
}

Проблема в том что если автор или название содержат пробелы (то етсь несколько слов) то считывается только первое...
3
26 мая 2010 года
Green
4.8K / / 20.01.2000
Цитата: mlt^^

Проблема в том что если автор или название содержат пробелы (то етсь несколько слов) то считывается только первое...


std::getline

307
26 мая 2010 года
Artem_3A
863 / / 11.04.2008
тогда после значения читай символ из потока, что бы выдрать от туда '\n'.

интересные у тебя функции get_* и возвращают, и устанавливают значение, интересненько...
44K
26 мая 2010 года
mlt^^
63 / / 01.04.2010
Сделал чтение вот так:
Код:
std::ifstream& operator >> (std::ifstream& stream, book& _book)
{
    const unsigned char max=40;
    char buf[max];
    stream>>_book.get_id();
    stream.ignore(5, '\n');
    stream.getline(buf, max, '\n');
    _book.get_author()=buf;
    stream.getline(buf, max,'\n');
    _book.get_title()=buf;
    stream>>_book.get_pages();
    return stream;
}

Работает правильно, но код мне не нарвится, как то слишком всё не тру =) Но пока мои мозги не до чего лучшего не доходят.

Кстати, так что же лучше использовать для базы книг vector или set ? я сейчас пробую set сделать .
Функции типа get_ просто возвращают private член по ссылке, это конечно не очень тру с точки зрения сохранности данных, но так проще обращаться извне класса.
307
26 мая 2010 года
Artem_3A
863 / / 11.04.2008
ты не поверишь, но операторы можно перегрузить дружественными.
44K
26 мая 2010 года
mlt^^
63 / / 01.04.2010
Поверю, просто я всего лишь средненький студент 2 курса.
То есть можно сделать оператор дружественный к классу и он будет видеть его приват поля без всяких паблик функций ?
307
26 мая 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: mlt^^
Поверю, просто я всего лишь средненький студент 2 курса.
То есть можно сделать оператор дружественный к классу и он будет видеть его приват поля без всяких паблик функций ?



совершенно верно, а мего функции гет верни в нормально положение.

297
27 мая 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: mlt^^
Сделал чтение вот так:
Код:
std::ifstream& operator >> (std::ifstream& stream, book& _book)
{
    const unsigned char max=40;
    char buf[max];
    stream>>_book.get_id();
    stream.ignore(5, '\n');
    stream.getline(buf, max, '\n');
    _book.get_author()=buf;
    stream.getline(buf, max,'\n');
    _book.get_title()=buf;
    stream>>_book.get_pages();
    return stream;
}

Работает правильно, но код мне не нарвится, как то слишком всё не тру =) Но пока мои мозги не до чего лучшего не доходят.


Не тру. Green сказал же - использовать std::getline, а не метод потока.

Код:
ifstream& operator >> (ifstream& stream, book& book_)
{
    stream >> book_.id;
    stream.ignore();

    getline(stream, book_.author);
    getline(stream, book_.title);

    stream >> book_.pages;
    //stream.ignore();

    return stream;
}
44K
28 мая 2010 года
mlt^^
63 / / 01.04.2010
Как читать\записывать в файл стркои в бинарном режиме (нужно для хранения пользователей и их паролей).
Записываю примерно так :
 
Код:
ofstream& operator << (ofstream& stream, user& ur)
{
    stream<<ur.get_name()<<endl;
    return stream;
}
ifstream& operator >> (ifstream& stream, user& ur)
{
    stream>>ur.get_name();
    return stream;
}

Есть класс man с полем private name. От него унаследован класс user. В man функция string get_name() {return name} соответственно нужно ли строку (name) возвращать по ссылке, потому что считывает не правильно =(
307
28 мая 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: mlt^^

Есть класс man с полем private name. От него унаследован класс user. В man функция string get_name() {return name} соответственно нужно ли строку (name) возвращать по ссылке, потому что считывает не правильно =(



ну во первых, поле имени надо сделать защищенным, а не приватным. тогда оно будет доступно в классе потомке. во вторых, можно в перегруженном операторе для класса пользователей читать только те данные которых нет в классе человека, а потом вызывать оператор ввода вывода для класса человека. это будет гораздо правильней, ну если конечно базовый класс не чисто виртуальный! в третьих, функции гет возвращают значения, а не изменяют его, логически это не правильно, так что оставь их в покое. в четвертых, иди почитай книжки хорошенько, все твои проблемы возникают из за обрывочности знаний.

44K
02 июня 2010 года
mlt^^
63 / / 01.04.2010
Как решить проблему с русским шрифтом и локализацией ? суть проблемы состоит в том, что в переменных стринг описанных в модулях подключаемых к главной проге вместо русских шрифтов хранится кракозябры.
в файле с main() прописано setlocale(LC_ALL, "Russian"); но с русским вводом выводом констант пробелм нет а вот именно когда записываю в стринг то получается лажа ...
307
03 июня 2010 года
Artem_3A
863 / / 11.04.2008
стринг по дефолту работает с ascii, следует использовать юникод, то бишь wstring, wcin, wcout... погугли, тема не однократно поднималась.
44K
03 июня 2010 года
mlt^^
63 / / 01.04.2010
то есть полноценная поддержка русских символов только в юникоде, соответственно все начинается с w и занимает больший размер памяти нежели остальное, в том числе и wchar_t и wstring и тд ...

P.s: Проблемка с чтением записью в текстовый файл. Суть такая, есть программа, которая делает список студентов (курсовая короче), соответственно поля в классе такие:
 
Код:
protected:
    char* surname; // фамилия
    char* name;    // имя
    int   growth;  // рост
    int   weight;  // вес
    int   id;     // ключевое поле
    static int num;

Запсь в файл я произвожу вот так вот :
Код:
...
ofstream file_;
file_.open("save");
file_<<ob2;
file_.close();
cout<<"Запись прошла успешна."<<endl;
...
ofstream& operator << (ofstream &stream, stud &ob)
{
    stream<<ob.id<<'\n';
    stream<<ob.surname<<'\n';
    stream<<ob.name<<'\n';
    stream<<ob.growth<<'\n';
    stream<<ob.weight<<'\n';
    stream<<ob.kurs<<'\n';
    stream<<ob.year<<'\n';
    return stream;
}

Потом читаю (вот тут вот проблема):
Код:
...
ifstream _file;
_file.open("save");
_file>>ob2;
_file.close();
cout<<"Чтение прошла успешна."<<endl;
...
ifstream& operator >> (ifstream &stream, stud &ob)
{
    stream>>ob.id;
    if(ob.id > ob.num)
        ob.num = ob.id;
    stream.ignore(50, '\n');
    stream.getline(ob.surname, 20, '\n');
    stream.getline(ob.name, 20, '\n');
    stream>>ob.growth;
    stream>>ob.weight;
    stream>>ob.kurs;
    stream>>ob.year;
    stream.ignore();
    return stream;
}

Читаю и записываю я список . То есть вот таким вот образом :
Код:
// запись
ofstream& operator << (ofstream &stream, spisok &sp)
{
   
    stud* pt(sp.head);
    while(pt)
    {
        stream<<*pt;
        pt=pt->get_next();
    }
    return stream;
}

А вот при чтении и добавлении он считывает лишнего студента, причем пустого, то есть у меня в файле 2 студента, он считывает третьего у которого откуда то берется ID, а всё останое по нулям и пустые строк ""
Код:
//Чтение
ifstream& operator >> (ifstream &stream, spisok &sp)
{
    stud* ob;
    while(stream)
    {
        ob = new stud;
        stream>>*ob;
        if(!sp.head)
            sp.head=ob;
        else
        {
            sp.head->set_prev(ob);
            ob->set_next(sp.head);
            sp.head=ob;
        }
    }
    return stream;
}

В файл записывается примерно вот так (кстати, возможно проблема с позицией в файле, потому что если после последнего записанного символа удалить невидимый '\n' чтоб курсор стоял прям после числа, и сохранить, то потом прочитается идеально):
Код:
3
saprikina
alina
170
70
2
5
4
abazova
ada
160
50
2
5
44K
03 июня 2010 года
mlt^^
63 / / 01.04.2010
Блин, какой то я проблемный. Вообще кое-как поменял всё на w... только одна проблема. Когда вывожу русские константы : wcout<<L"русский текст"; то он выводится только если установить локаль: setlocale(LC_ALL, "Russian"); НО если установить локаль, не выводятся\вводятся переменные типа wstring , то есть я пишу типа wcin>>переменная_типа_wstring; потом вывожу wcout<<эту_переменную и выводится какие то иероглифы. Если не устанавливать локаль, то константы не выводятся вообще , а переменные типа wstring даже не вводятся.
44K
03 июня 2010 года
mlt^^
63 / / 01.04.2010
Помогите сделать так, чтобы можно было и константы русские выводить без проблем и в переменных типа string хранить и обрабатывать русские строки.
44K
03 июня 2010 года
mlt^^
63 / / 01.04.2010
Код:
#include <windows.h>
int main()
{
    setlocale(LC_ALL, "");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    std::wcout<<L"Русский текст"<<endl;
    std::wstring str;
    std::wcin>>str;
    std::wcout<<str<<endl;
return 0;
}

При том что шрифт в консоле НЕ точечный ...
297
03 июня 2010 года
koodeer
1.2K / / 02.05.2009
Код:
#include<windows.h>
#include<iostream>
#include<string>
using namespace std;
int main()
{
    wcout.imbue(locale("rus_rus.866"));
    wcin.imbue(locale("rus_rus.866"));

    wcout << L"Русский текст" << endl;
    wstring str;
    wcin >> str;
    wcout << str << endl;
    return 0;
}


Цитата: mlt^^
то есть полноценная поддержка русских символов только в юникоде


Кто вам сказал, что применение wstring и wchar_t автоматически означает юникод? Посмотрите, что стоит в настройках вашего проекта - Character Set: Use Unicode Character Set или Use Multi-Byte Character Set. Хотя приведённый способ работает и так, и так.

P.S. Что-то вы мечетесь туда-сюда. То set хотите использовать, то vector, для строк то string, то char*, то wstring...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог