none
Считать русский текст из файла в консоль, С++ RRS feed

  • Вопрос

  • Здравствуйте. Подскажите пожалуйста, как правильно считать русский текст из текстового дока в стандартной кодировке в консоль на С++?

    Пытаюсь считать таким образом, но в консоль не выводится вообще ничего:

    struct test
    {
        string question;
        string kind_of_answer [4];
        char answer;
    };
    int p;
    setlocale(LC_ALL,"Russian");
    cin>>p;
    ifstream ifs;
    ifs.open("1.txt");
    test MAS[SIZE];
    for (int i=0; i<SIZE; i++)
        {
            cout << MAS[i].question;
            cout << endl;
            for (int j=0; j<NUM; j++)
            {
                cout << letter [j] << MAS[i].kind_of_answer[j];
                cout << endl;
            }
            cin >> user [i];
        }

    Тут привел не полный код, но вроде именно эта часть отвечает за считывание и заполнение структуры. Если верить отладчику, то после считывания нужное поле структуры оказывается пустым. Что я делаю не так?

    DreamSpark Premium User

Ответы

  • Если нужно, вот весь компилируемый код:

    #include <iostream>
    #include <fstream>
    #include <Windows.h>
    #include <string>
     using namespace std;
    struct test
    {
        string question;
        string kind_of_answer [4];
        char answer;
    };
    int main()
    {
    	int p;
    	setlocale(LC_ALL,"Russian");
    	cout<<"1 - История"<<endl;
    	cout<<"2 - Психология"<<endl;
    	cout<<"3 - Русский Язык"<<endl;
    	cout<<"4 - Информатика и ООП\n";
    	cin>>p;
    	ifstream ifs;
    	switch (p)
    	{
    	case 1:
    		ifs.open("1.txt");
    		break;
    	case 2:
    		ifs.open("2.txt");
    		break;
    	case 3:
    		ifs.open("3.txt");
    		break;
    	case 4:
    		ifs.open("4.txt");
    		break;
    	case 5:
    		ifs.open("5.txt");
    		break;
    	case 6:
    		ifs.open("6.txt");
    		break;
    	default:
    		cout << "Нету такой дисциплины.\n";
    	}
     
        const int SIZE=20; // кол-во вопросов
        const int NUM=4; // кол-во вариантов ответов.
        
        test MAS[SIZE];
        char user [SIZE]; // будет содержать все варианты ответа пользователя.
        char *letter [NUM] = {"a) ", "b) ", "c) ", "d) "}; // для удоства вывода.
     
        // заполнение структуры с файла.
        for (int i=0; i<SIZE; i++)
        {
            getline (ifs, MAS[i].question);
            for (int j=0; j<NUM; j++)
                getline (ifs, MAS[i].kind_of_answer[j]);
            ifs >> MAS[i].answer;
        }
        // ответы пользователя.
        for (int i=0; i<SIZE; i++)
        {
            cout << MAS[i].question;
            cout << endl;
            for (int j=0; j<NUM; j++)
            {
                cout << letter [j] << MAS[i].kind_of_answer[j];
                cout << endl;
            }
            cin >> user [i];
        }
        // находим кол-во баллов.
        int cnt=0;
        for (int i=0; i<SIZE; i++)
            if (MAS[i].answer == user[i]) ++cnt;
        //
        cout << "Правильных ответов: " << cnt << endl;
        cout << "Неправильных ответов: " << SIZE - cnt << endl;
     
        ifs.close ();
    	system("pause");
        return 0;
    }


    DreamSpark Premium User

    • Помечено в качестве ответа Abolmasov Dmitry 31 мая 2012 г. 10:08

Все ответы

  • Если нужно, вот весь компилируемый код:

    #include <iostream>
    #include <fstream>
    #include <Windows.h>
    #include <string>
     using namespace std;
    struct test
    {
        string question;
        string kind_of_answer [4];
        char answer;
    };
    int main()
    {
    	int p;
    	setlocale(LC_ALL,"Russian");
    	cout<<"1 - История"<<endl;
    	cout<<"2 - Психология"<<endl;
    	cout<<"3 - Русский Язык"<<endl;
    	cout<<"4 - Информатика и ООП\n";
    	cin>>p;
    	ifstream ifs;
    	switch (p)
    	{
    	case 1:
    		ifs.open("1.txt");
    		break;
    	case 2:
    		ifs.open("2.txt");
    		break;
    	case 3:
    		ifs.open("3.txt");
    		break;
    	case 4:
    		ifs.open("4.txt");
    		break;
    	case 5:
    		ifs.open("5.txt");
    		break;
    	case 6:
    		ifs.open("6.txt");
    		break;
    	default:
    		cout << "Нету такой дисциплины.\n";
    	}
     
        const int SIZE=20; // кол-во вопросов
        const int NUM=4; // кол-во вариантов ответов.
        
        test MAS[SIZE];
        char user [SIZE]; // будет содержать все варианты ответа пользователя.
        char *letter [NUM] = {"a) ", "b) ", "c) ", "d) "}; // для удоства вывода.
     
        // заполнение структуры с файла.
        for (int i=0; i<SIZE; i++)
        {
            getline (ifs, MAS[i].question);
            for (int j=0; j<NUM; j++)
                getline (ifs, MAS[i].kind_of_answer[j]);
            ifs >> MAS[i].answer;
        }
        // ответы пользователя.
        for (int i=0; i<SIZE; i++)
        {
            cout << MAS[i].question;
            cout << endl;
            for (int j=0; j<NUM; j++)
            {
                cout << letter [j] << MAS[i].kind_of_answer[j];
                cout << endl;
            }
            cin >> user [i];
        }
        // находим кол-во баллов.
        int cnt=0;
        for (int i=0; i<SIZE; i++)
            if (MAS[i].answer == user[i]) ++cnt;
        //
        cout << "Правильных ответов: " << cnt << endl;
        cout << "Неправильных ответов: " << SIZE - cnt << endl;
     
        ifs.close ();
    	system("pause");
        return 0;
    }


    DreamSpark Premium User

    • Помечено в качестве ответа Abolmasov Dmitry 31 мая 2012 г. 10:08
  • помогите пожалуйста код поправить, очень надо, С++ ж нифига не знаю (:


    DreamSpark Premium User

  • Здравствуйте.

    Приведенный вами код полностью работает и выводит русские символы в консоль исправно. Система Windows 7, возможно у вас стоит какая то нестандартная кодировка в самой консоле. Можете посмотреть это в свойствах окна консоли. Также стандартной кодировкой консоли является 866 codepage.

    Вы разобрались с данным вопросом?


    Для связи [mail]

  • Да, разобрался. Как ни странно, но проблема была непонятно в чём. Код не работал ни на ноуте, ни на стационарнике. Но спустя два дня сам заработал, хотя все эти два дня компьютеры были выключены.

    DreamSpark Premium User