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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
14.07.2015, 14:36     Наследование от ofstream и перегрузка << #1
Добрый день, гуглил на английском языке, но ответа не попалось. Предыстория: некий объекта принимает в качестве параметра ссылку на ostream, куда подсовывается ofstream. Задача в том, что перед действием << требуется сделать дополнительные телодвижения, а точнее обработать данные, которые направляются на выход. Я вижу решение таким, что нужно наследоваться от ofstream и переопределить <<. как это правильно делается нагуглить не удалось. Буду рад приведенным примерам или ссылкам на статьи об этом. Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2658 / 1669 / 156
Регистрация: 13.01.2012
Сообщений: 6,214
20.07.2015, 14:37     Наследование от ofstream и перегрузка << #41
Цитата Сообщение от VVildVVolf Посмотреть сообщение
Вы хотели сказать НЕ в винде?
просто показалась что вы из Этих.. которые не в винде)
раз уж так рассказывайте что за система что за диски что за пользователи что за среда разработки есть ли антивирусы, DEP и прочая шляпа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 14:43  [ТС]     Наследование от ofstream и перегрузка << #42
Цитата Сообщение от vxg Посмотреть сообщение
просто показалась что вы из Этих.. которые не в винде)
странно, с чего бы..
на ноуте винда (ваз 2107) стоит на виртуалке, никаких антивирусов, ниче (скорее вирусов могло накачаться), специально ни права ничего не настраивал, только гостевое расширение виртуалБокса, студия 2012я.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
20.07.2015, 14:46     Наследование от ofstream и перегрузка << #43
Цитата Сообщение от VVildVVolf Посмотреть сообщение
C++
1
ofstream os2("C://lol/lout.txt");
C++
1
ofstream os2("C:\\lol\\lout.txt");
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 14:48  [ТС]     Наследование от ofstream и перегрузка << #44
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
ofstream os2("C:\\lol\\lout.txt");
и так, и
C++
1
ofstream os2("C:\\\\lol\\lout.txt");
тоже
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
20.07.2015, 14:49     Наследование от ofstream и перегрузка << #45
Накой 4 слеша?
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 14:50  [ТС]     Наследование от ofstream и перегрузка << #46
да просто что уже только не пробывал
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
20.07.2015, 14:52     Наследование от ofstream и перегрузка << #47
А что тут пробовать, тут либо права либо неправильный путь или и то и другое.
Но очивидно что так как вы указываете слеши неправильно.
В винде слеши должны быть "\" плюс еще один для экранирования как строки.
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 14:56  [ТС]     Наследование от ofstream и перегрузка << #48
Цитата Сообщение от Avazart Посмотреть сообщение
либо права
ну а почему тогда в своей-то директории создаёт? разве в винде есть такая фигня, чтоб прога в своей директории только в корне могла файлы создавать?

Добавлено через 2 минуты
хм, при существующей папке, оказывается, пишет (с обратными слэшами), но создавать папку в упор не хотит...
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
20.07.2015, 14:59     Наследование от ofstream и перегрузка << #49
Цитата Сообщение от VVildVVolf Посмотреть сообщение
ну а почему тогда в своей-то директории создаёт? разве в винде есть такая фигня, чтоб прога в своей директории только в корне могла файлы создавать?
А что прога лежит где-то в системной папке?

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

Добавлено через 5 минут
Придется вызывать
C++
1
2
3
#include <direct.h>
...
    mkdir("C:\\lol\\");
окей, с одной проблемой разобрались, всем участникам объявляется благодарность)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.07.2015, 15:34     Наследование от ofstream и перегрузка << #53
Цитата Сообщение от vxg Посмотреть сообщение
я всегда думал что эндл это просто вставка платформозависимого делителя. но наверное она еще и синк зовет.
http://en.cppreference.com/w/cpp/io/manip/endl
Вставляет символ и зовет flush. flush в свою очередь зовет sync.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
20.07.2015, 15:43     Наследование от ofstream и перегрузка << #54
boost/filesystem create_directory
Пути к файлам

Не по теме:

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

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

Не по теме:

Avazart, В 17 по идее.



Добавлено через 32 секунды
VVildVVolf, Касательно проблем с выводом - показывайте код.
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 16:01  [ТС]     Наследование от ofstream и перегрузка << #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;
}
второй дебаг никогда не выводится, несмотря на то, что выполнение доходит до него (в отладчике)
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,570
Записей в блоге: 17
20.07.2015, 16:35     Наследование от ofstream и перегрузка << #58
C++
1
output<<"DEBUG 2"<<endl;
или
C++
1
2
output<<"DEBUG 2";
output.flush();
VVildVVolf
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 16:38  [ТС]     Наследование от ofstream и перегрузка << #59
ни то, ни другое не спасло, да и в конструкторе без того и без другого DEBUG 1 выводится
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2015, 16:55     Наследование от ofstream и перегрузка <<
Еще ссылки по теме:

Перегрузка ifstream и ofstream? C++
C++ Перегрузка ifstream и ofstream для работы с файлами в little-endian формате?

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.07.2015, 16:55     Наследование от ofstream и перегрузка << #60
VVildVVolf, Гм. Лучше весь код и его использование. Буфер для стрима не меняется, поэтому вывод должен быть. Вывод идет в cout или в fstream?
Yandex
Объявления
20.07.2015, 16:55     Наследование от ofstream и перегрузка <<
Ответ Создать тему
Опции темы

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