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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
#1

Наследование от ofstream и перегрузка << - C++

14.07.2015, 14:36. Просмотров 1505. Ответов 70
Метки нет (Все метки)

Добрый день, гуглил на английском языке, но ответа не попалось. Предыстория: некий объекта принимает в качестве параметра ссылку на ostream, куда подсовывается ofstream. Задача в том, что перед действием << требуется сделать дополнительные телодвижения, а точнее обработать данные, которые направляются на выход. Я вижу решение таким, что нужно наследоваться от ofstream и переопределить <<. как это правильно делается нагуглить не удалось. Буду рад приведенным примерам или ссылкам на статьи об этом. Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2015, 14:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование от ofstream и перегрузка << (C++):

Перегрузка ifstream и ofstream? - C++
Есть класс //test.h cass test { private: int i; string st; public:

Перегрузка ofstream, istream - C++
В общем-то ошибка в описана в самом коде //main.cpp #include &quot;ui.cpp&quot; int main() { ui iu; iu.menu(); iu.casein(); ...

Перегрузка ofstream / ifstream для классов - C++
Приветствую! Возникла трудность. Имеется класс с данными. Необходимо реализовать чтение и ввод объекта класса в файл посредством перегрузки...

Перегрузка ifstream и ofstream для работы с файлами в little-endian формате? - C++
Всем привет, мне нужно реализовать классы для работы с файлами в little-endian формате. Для этого задумал сделать public-потомки...

Наследование и перегрузка << - C++
Здравствуйте! Столкнулся со следующей проблемой: class A { int data,info; // .. public: friend void operator &lt;&lt;(ostream &amp;a,...

Наследование и перегрузка операторов - C++
Помогите, пожалуйста! Ткните носом в ошибки.. не судите строго - первая прога в С++, как и в объектно-ориент программировании: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 14:50  [ТС] #46
да просто что уже только не пробывал
0
Avazart
Эксперт С++
7185 / 5359 / 280
Регистрация: 10.12.2010
Сообщений: 23,650
Записей в блоге: 17
20.07.2015, 14:52 #47
А что тут пробовать, тут либо права либо неправильный путь или и то и другое.
Но очивидно что так как вы указываете слеши неправильно.
В винде слеши должны быть "\" плюс еще один для экранирования как строки.
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 14:56  [ТС] #48
Цитата Сообщение от Avazart Посмотреть сообщение
либо права
ну а почему тогда в своей-то директории создаёт? разве в винде есть такая фигня, чтоб прога в своей директории только в корне могла файлы создавать?

Добавлено через 2 минуты
хм, при существующей папке, оказывается, пишет (с обратными слэшами), но создавать папку в упор не хотит...
0
Avazart
Эксперт С++
7185 / 5359 / 280
Регистрация: 10.12.2010
Сообщений: 23,650
Записей в блоге: 17
20.07.2015, 14:59 #49
Цитата Сообщение от VVildVVolf Посмотреть сообщение
ну а почему тогда в своей-то директории создаёт? разве в винде есть такая фигня, чтоб прога в своей директории только в корне могла файлы создавать?
А что прога лежит где-то в системной папке?

Добавлено через 1 минуту
Цитата Сообщение от VVildVVolf Посмотреть сообщение
но создавать папку в упор не хотит...
А с какого он папки должен создавать сам за Вас?
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 15:04  [ТС] #50
Цитата Сообщение от Avazart Посмотреть сообщение
А что прога лежит где-то в системной папке?
нет, в документах
Цитата Сообщение от Avazart Посмотреть сообщение
А с какого он папки должен создавать сам за Вас?
http://stackoverflow.com/questions/1...directory-in-c или нельзя этому верить?
0
ct0r
Игогошка!
1773 / 675 / 42
Регистрация: 19.08.2012
Сообщений: 1,287
Завершенные тесты: 1
20.07.2015, 15:12 #51
Цитата Сообщение от VVildVVolf Посмотреть сообщение
http://stackoverflow.com/questions/1...directory-in-c или нельзя этому верить?
Ну и где там папки создаются? fopen не создает папки, а по сути ведь он выполняет основную работу. /tmp - изначально существующая папка.
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 15:19  [ТС] #52
хотя пардон, там не говорится, что оно должно создать подпапку...

Добавлено через 5 минут
Придется вызывать
C++
1
2
3
#include <direct.h>
...
    mkdir("C:\\lol\\");
окей, с одной проблемой разобрались, всем участникам объявляется благодарность)
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
20.07.2015, 15:34 #53
Цитата Сообщение от vxg Посмотреть сообщение
я всегда думал что эндл это просто вставка платформозависимого делителя. но наверное она еще и синк зовет.
http://en.cppreference.com/w/cpp/io/manip/endl
Вставляет символ и зовет flush. flush в свою очередь зовет sync.
2
Avazart
Эксперт С++
7185 / 5359 / 280
Регистрация: 10.12.2010
Сообщений: 23,650
Записей в блоге: 17
20.07.2015, 15:43 #54
boost/filesystem create_directory
Пути к файлам

Не по теме:

filesystem вроде как должны были включить в стандарт ?

0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 15:46  [ТС] #55
Цитата Сообщение от Avazart Посмотреть сообщение
boost/filesystem create_directory
Пути к файлам
с этим вроде разобрался (слэши + несоздание подпапок автоматически), проблема осталась только при вводе данных в сам поток
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
20.07.2015, 15:49 #56

Не по теме:

Avazart, В 17 по идее.



Добавлено через 32 секунды
VVildVVolf, Касательно проблем с выводом - показывайте код.
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 16:01  [ТС] #57
Покажу частично (чтоб сообщение было компактнее), если недостаточно, выложу весь класс:
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
//.h
namespace FilteringOutput{
 
    class FilteringStreamBuf : public std::streambuf{
    public:
        FilteringStreamBuf(ostream& os);
        void ForceWrite(const char* str);
        virtual ~FilteringStreamBuf();
    protected:
        virtual int sync();
        virtual int_type overflow(int_type __c = traits_type::eof());
 
        virtual void Put(const char c);
    private:
        bool LastSymbolIsSeparator;
        bool IsSeparator(const char c)const;
        void ToOutput(const char* str);
        ostream& output;
        string buffer;
 
        static const int MAX_LINE = 80;
    };
 
};
 
//.cpp
FilteringStreamBuf::FilteringStreamBuf(ostream& os):output(os),LastSymbolIsSeparator(false){
    //DEBUG
    output<<"DEBUG 1";
    //DEBUG
}
 
FilteringStreamBuf::~FilteringStreamBuf(){
    sync();
}
 
 
FilteringStreamBuf::int_type FilteringStreamBuf::overflow(int_type __c)
{
    auto c =  traits_type::to_char_type(__c);
 
    if (IsSeparator(c)){
        if (!LastSymbolIsSeparator){
            Put(' ');
        }
    }else{
        Put(c);
    }
 
    return traits_type::not_eof(__c);
}
 
int FilteringStreamBuf::sync(void)
{
    //DEBUG
    output<<"DEBUG 2";
    //DEBUG
 
    ToOutput(buffer.c_str());
 
    buffer.clear();
    return 0;
}
второй дебаг никогда не выводится, несмотря на то, что выполнение доходит до него (в отладчике)
0
Avazart
Эксперт С++
7185 / 5359 / 280
Регистрация: 10.12.2010
Сообщений: 23,650
Записей в блоге: 17
20.07.2015, 16:35 #58
C++
1
output<<"DEBUG 2"<<endl;
или
C++
1
2
output<<"DEBUG 2";
output.flush();
0
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 16:38  [ТС] #59
ни то, ни другое не спасло, да и в конструкторе без того и без другого DEBUG 1 выводится
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
20.07.2015, 16:55 #60
VVildVVolf, Гм. Лучше весь код и его использование. Буфер для стрима не меняется, поэтому вывод должен быть. Вывод идет в cout или в fstream?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2015, 16:55
Привет! Вот еще темы с ответами:

Наследование и перегрузка методов - C++
Здравствуйте. Пытаюсь выполнить упр. 8 из главы 11 книги Р.Лафоре &quot;ООП в С++&quot;, соорудил такое древо классов (картинка в конце поста). Если...

Наследование и перегрузка операторов. - C++
У меня есть базовый класс class myfloat { protected: int c; int z; void reduce(); public: myfloat(float num=0);

Наследование, перегрузка, конструктор - C++
#include &lt;iostream&gt; class animal { public: animal() { } animal(int a) { age = a; } ~animal() { } void set_age(int b) { age...

Перегрузка оператора ввода и наследование - C++
Добрый день! Обращаюсь по такому поводу. Есть одна программа, в которой требуется перегрузить операторы ввода.вывода для одного из...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.07.2015, 16:55
Ответ Создать тему
Опции темы

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