Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Artaner
1 / 1 / 1
Регистрация: 08.06.2013
Сообщений: 70
#1

Пользовательские флаги формата потока и манипуляторы - C++

25.03.2017, 16:55. Просмотров 186. Ответов 5
Метки нет (Все метки)

Всем здравствуйте, возникла такая вот проблема: не понимаю как правильно создать свой флаг формата и правильно указать его для потока ввода\вывода (для консоли и файла).

Имеется такая структура файлов: work.h(parse.h(student.h)), т.е. в файле work.h есть #include "parse.h" ну и в "parse.h" есть #include "student.h".

Собственно проблема возникла после добавления parse.h (без нее - все работает).

В student.h определены манипуляторы:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
static const int iword_index = ios_base::xalloc();
 
template <typename charT, typename traits>
inline basic_ofstream<charT, traits>&
operator << (basic_ofstream<charT, traits>& Output, Student& Student)
{
    basic_ostringstream<charT, traits> _output;
    _output.copyfint(out);
    _output.width(0);
 
    _output << Student.Name << "\t" << Student.Initials << "\t" << Student.Group_Number << "\t" << Student..Email;
 
    if (Output.iword(iword_index))
        _output << endl;
    if (!Output.iword(iword_index))
        _output << "\t";
 
    Output << _output.str();
 
    return Output;
}
 
template <typename charT, typename traits>
inline basic_ostream<charT, traits>&
operator << (basic_ostream<charT, traits>& Output, Student& Student)
{
    basic_ostringstream<charT, traits> _output;
    _output.copyfmt(Output);
    _output.width(0);
 
    _output << Student.Name() << "\t";
    Student.Initials() == "" ? _output << "Нет иницилов\t" : _output << Student.Initials() << "\t";
    Student.Group_Number() == "" ? _output << "Нет группы\t" : _output << Student.Group_Number() << "\t";
    Student.Email() == "" ? _output << "Нет адреса" << endl : _output << Student.Email();
 
    if (Output.iword(iword_index))
        _output << "\n";
    if (!Output.iword(iword_index))
        _output << "\t";
 
    Output << _output.str();
 
    return Output;
}
 
template <typename charT, typename traits>
inline basic_ifstream<charT, traits>&
operator >> (basic_ifstream<charT, traits>& Input, Student& Student)
{
    string _input[4];
    for (int i = 0; i < 4; i++)
        Input >> _input[i];
 
    /*if (!Input)
        return Input;
    if (!Student.CheckEmailR(_input[3]))
    return Input;*/
 
    Student.Name(_input[0]);
    Student.Initials(_input[1]);
    Student.Group_Number(_input[2]);
    Student.Email(_input[3]);
 
    return Input;
}
 
template <typename charT, typename traits>
inline basic_istream<charT, traits>&
operator >> (basic_istream<charT, traits>& Input, Student& Student)
{
    string _input[4];
    cout << "\nВведите данные студента:\nФамилия:\t";
    Input >> _input[0];
    cout << "Инициалы:\t";
    Input >> _input[1];
    cout << "Группу:\t\t";
    Input >> _input[2];
    cout << "Email:\t\t";
    Input >> _input[3];
    cout << endl;
 
    /*if (!Input)
        return Input;
    if (!Student.CheckEmailR(_input[3]))
    return Input;*/
 
    Student.Name(_input[0]);
    Student.Initials(_input[1]);
    Student.Group_Number(_input[2]);
    Student.Email(_input[3]);
 
    return Input;
}
В work.cpp пользовательские флаги:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ofstream& NonInLine(ofstream& Output)
{
    Output.iword(iword_index) = true;
    return Output;
}
ofstream& InLine(ofstream& Output)
{
    Output.iword(iword_index) = false;
    return Output;
}
ostream& NonInLine(ostream& Output)
{
    Output.iword(iword_index) = true;
    return Output;
}
ostream& InLine(ostream& Output)
{
    Output.iword(iword_index) = false;
    return Output;
}

При дебагге в work.cpp переменная iword_index равна 3, а в манипуляторе равна 1 (это сейчас вывод на консоль). Я даже не до конца уверен что это правильный подход для пользовательских флагов.

В идеале эти флаги должны так же работать и в parse.h. Причем если данные флаги перенести из work.cpp в parse.cpp, то work их не видит почему-то, если их перенести в parse.h или другой *.h то там ошибки вида: "множественное определение", LNK2005,LNK1169.

Может кто помочь с этим и\или подсказать где искать инфу или куда вообще "копать"?

Добавлено через 14 минут
Нашел почему такое происходит, но без понятия как это решить. Собственно если закоментить эту строчку, то все работает как надо:
C++
1
2
3
4
5
6
7
8
9
10
11
void Parse::Delete(vector<string> Strings, vector<Student>& Students)
{
    vector<string> _request = MakeRequest(Strings);
    for (int i = 0; i < Students.size(); i++)
        if (Students[i].Check(_request))
        {
            cout << "Удален студент:" << endl;
            //cout << Students[i] << endl;
            Students.erase(Students.begin() + i--);
        }
}
Как сделать так, что бы флаги были видны как в parse так и в work? Причем эти флаги должны быть одни и те же.
http://www.cyberforum.ru/cpp-beginners/thread100883.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2017, 16:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Пользовательские флаги формата потока и манипуляторы (C++):

Флаги форматирования и манипуляторы
У многих новичков возникают вопросы, как вывести число в таком-то формате, а...

Манипуляторы ввода-вывода. Флаги
Здравствуйте. Моя задача такова: нужно сделать программу, которая будет ждать...

Пользовательские битовые флаги
Заинтересовала следующая конструкция: если: 1 - Девушка 2 - Мужчина 3 -...

Используйте флаги формата класса ios
Напишите программу для вывода значения 1000.5364 в 20-символьном поле, с...

Флаги потока cout.
Здравствуйте. Возник вопрос. В данным момент в целях изучения пишу класс...

5
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
25.03.2017, 16:58 #2
Разве это манипуляторы? Просто перегрузка >> и << для класса Student.
0
Artaner
1 / 1 / 1
Регистрация: 08.06.2013
Сообщений: 70
25.03.2017, 17:47  [ТС] #3
Ах да, ошибочка, манипуляторы это то, что я назвал "пользовательские флаги" (2 кусок кода). А там, согласен, просто перегрузка для класса. Но проблема в том, что не могу никак сделать что бы iword_index в work.cpp был таким же как в student и parse (они там одни и те же), так же как сделать общие манипуляторы (мб это решит проблему) для work и parse?
0
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
25.03.2017, 19:15 #4
Я не понял, ты спрашиваешь как манипулятор делать или как глобальную переменную объявить? В h вообще не должно быть переменных, только типы. В таком виде у тебя разные экземпляры iword_index в разных модулях.
0
Artaner
1 / 1 / 1
Регистрация: 08.06.2013
Сообщений: 70
26.03.2017, 13:27  [ТС] #5
Как сделать так, что бы манипуляторы работали и в work и в parse. Вот что интересует меня и как правильно реализовывать данные манипуляторы?

Добавлено через 15 часов 44 минуты
Хм, не знаю что это и как, но проблема решилась явным указанием что переменная глобальная в перегрузках операторов << и >>, т.е. написал ::iword_index.

Но вопрос до сих пор остается актуальным. Как сделать общие манипуляторы для нескольких классов?
0
nmcf
26.03.2017, 15:49     Пользовательские флаги формата потока и манипуляторы
  #6

Не по теме:

Они у тебя и не привязаны к классу.

0
26.03.2017, 15:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2017, 15:49
Привет! Вот еще темы с ответами:

манипуляторы
Создайте манипулятор ввода skipcbar(), который, поочередно, то считывает, то...

Манипуляторы. От С к С++
fprintf(f1, “%-7.3е”, x) Какая эквивалентная запись этой на С++?

Манипуляторы
Ребята, проблема с манипуляторами.. Вместо того чтобы были пустые места,...

манипуляторы
Создайте свои манипуляторы которые будут выполнять 1)вывод всех символов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru