Форум программистов, компьютерный форум CyberForum.ru

Манипуляторы ввода-вывода. Флаги - C++

Восстановить пароль Регистрация
 
x264
1 / 1 / 0
Регистрация: 12.07.2013
Сообщений: 18
12.07.2013, 16:46     Манипуляторы ввода-вывода. Флаги #1
Здравствуйте.
Моя задача такова: нужно сделать программу, которая будет ждать ввода числа в 16-ричной, 8-ричной или 10-тичной системе счисления, а потом выведет в какой системе счисления было это число.
Собственно, вопрос в том как это узнать? ff после строки ff=cin.flags(); равно 1 и это не зависит ни от чего.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//---------------------------------------------------------------------------
 
#pragma hdrstop
#include <iostream>
#include <iomanip>
#include <locale>
#include <tchar.h>
//---------------------------------------------------------------------------
using namespace std;
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{   int a;
    cin.unsetf(ios::dec|ios::hex|ios::oct);
    cin >> a;
    ios_base::fmtflags ff;
    ff=cin.flags();
 
    ios_base::fmtflags mask;
 
    mask=ios::_Fmtflags::_Fmtzero;
    mask=ios::dec;
    if (ff&mask)
    { // Число введено в 10-тичной системе счисления
        cout << dec << a << " (10-тичное) равно " << dec << a << "(10-тичное)";
        system("pause");
        return 0;
    }
 
    mask=ios::_Fmtflags::_Fmtzero;
    mask=ios::hex;
    if (ff&mask)
    { // Число введено в 16-ричной системе счисления
        cout << hex << a << " (16-ричное) равно " << dec << a << "(10-тичное)";
        system("pause");
        return 0;
    }
 
    mask=ios::_Fmtflags::_Fmtzero;
    mask=ios::oct;
    if (ff&mask)
    { // Число введено в 8-ричной системе счисления
        cout << oct << a << " (8-ричное) равно " << dec << a << "(10-тичное)";
        system("pause");
        return 0;
    }
 
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2013, 16:46     Манипуляторы ввода-вывода. Флаги
Посмотрите здесь:

Программа на С++ ввода/вывода C++
C++ Флаги форматирования и манипуляторы
Манипуляторы и флаги формата C++
Операторы ввода вывода в С++ C++
Манипуляторы ввода/вывода. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
12.07.2013, 17:05     Манипуляторы ввода-вывода. Флаги #2
Зачем мучать себя. Напишите код свой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cctype>
using namespace std;
 
#define SIZE_BUF 256
#define ERR_INPUT 0
 
int GetValueInAnyBase(int *a)
{
    char buf[SIZE_BUF] = {0};
    int base;
    
    cin >> buf;
 
    if(buf[0] == '0' && tolower(buf[1]) == 'x') base = 16;
    else if(buf[0] == '0' && isdigit(buf[1]))   base = 8;
    else if(isdigit(buf[0]) && buf[0] != '0')   base = 10;
    else base = ERR_INPUT;
 
    if(base != ERR_INPUT) *a = strtol(buf, NULL, base);
    
    return base;
}
 
void main(void)
{
    int a, base;
 
    cout << "enter value: ";
    base = GetValueInAnyBase(&a);
 
    if(base == ERR_INPUT)
        cout << "Input error." << endl;
    else
        cout << "value: " << a << " base: " << base << endl;
}
x264
1 / 1 / 0
Регистрация: 12.07.2013
Сообщений: 18
12.07.2013, 17:29  [ТС]     Манипуляторы ввода-вывода. Флаги #3
Я тоже думал о таком способе, но отказался от него из-за кучи вложенных if. Хотя, судя по всему, это единственный не извращенский вариант.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
12.07.2013, 18:23     Манипуляторы ввода-вывода. Флаги #4
вот ещё через strtol
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <cstdlib>
#include <cstring>
 
int main()
{
    char str[32], *pend = 0;
    long num = 0l;
    while(true)
    {
        std::cin >> str;
        num = strtol(str, &pend, 8);
        if(pend == str + strlen(str) && *str == '0')
            std::cout << "num: " << num << "\nbase: 8\n\n";
        else
        {
            num = strtol(str, &pend, 10);
            if(pend == str + strlen(str))
                std::cout << "num: " << num << "\nbase: 10\n\n";
            else
            {
                num = strtol(str, &pend, 16);
                if(pend == str + strlen(str))
                    std::cout << "num: " << num << "\nbase: 16\n\n";
                else
                    std::cerr << "Other base\n\n";
            }
        }
    }
    return 0;
}
x264
1 / 1 / 0
Регистрация: 12.07.2013
Сообщений: 18
12.07.2013, 19:11  [ТС]     Манипуляторы ввода-вывода. Флаги #5
Спасибо, то есть я правильно понимаю, что моим способом это сделать невозможно?
Yandex
Объявления
12.07.2013, 19:11     Манипуляторы ввода-вывода. Флаги
Ответ Создать тему
Опции темы

Текущее время: 11:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru