Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54

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

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

Студворк — интернет-сервис помощи студентам
Добрый день, гуглил на английском языке, но ответа не попалось. Предыстория: некий объекта принимает в качестве параметра ссылку на ostream, куда подсовывается ofstream. Задача в том, что перед действием << требуется сделать дополнительные телодвижения, а точнее обработать данные, которые направляются на выход. Я вижу решение таким, что нужно наследоваться от ofstream и переопределить <<. как это правильно делается нагуглить не удалось. Буду рад приведенным примерам или ссылкам на статьи об этом. Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.07.2015, 14:36
Ответы с готовыми решениями:

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

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

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

70
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
15.07.2015, 12:30
Лучший ответ Сообщение было отмечено VVildVVolf как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ForEveR Посмотреть сообщение
не сложилось
вот вариант который работает (просто вываливаю все что идет в поток на экран)
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
//---------------------------------------------------------------------------
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
#include <iostream>
#include <stdlib.h>
//---------------------------------------------------------------------------
class my_obj
{
public:
    void print(std::ostream &os)
    {
        os << 123 << std::endl;
    }
};
//---------------------------------------------------------------------------
class my_buf: public std::streambuf
{
private:
    std::string str;
    
protected:
    virtual int_type overflow(int_type __c = traits_type::eof())
    {
        str.append(1, traits_type::to_char_type(__c));
        return traits_type::not_eof(__c);
    }
 
    virtual int sync(void)
    {
        std::cout << str;
        str.clear();
        return 0;
    }
};
//---------------------------------------------------------------------------
class my_stream: public std::ostream
{
private:
    my_buf buf;
    
public:
    my_stream(void):
        std::ostream(0)
    {
        this->init(&buf);
    }
};
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
    my_stream os;
    my_obj obj;
    obj.print(os);
    obj.print(os);
    obj.print(os);
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
Добавлено через 5 минут
пожалуй лучшая ссылка на эту тему из тех которые я перелопатил
http://www.mr-edd.co.uk/blog/b... _streambuf

Добавлено через 3 минуты
тут тоже есть кое-что
http://stdcxx.apache.org/doc/s... .html#3832
http://stdcxx.apache.org/doc/stdlibug/39-2.html
http://stdcxx.apache.org/doc/stdlibug/39-3.html
но все вокруг да около и не в те ворота (у меня нифига не заработало), но может кто-то что-то найдет
3
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.07.2015, 13:23
vxg, А вот за это спасибо. Про init я как-то не знал. Да и вообще статьи интересные.
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
#include <iostream>
#include <array>
#include <functional>
#include <algorithm>
 
class formatting_streambuf: public std::streambuf
{
   typedef std::function<std::string(const std::string&)> formatter_t;
public:
   formatting_streambuf(std::streambuf* buf, const formatter_t& formatter) : buffer_{}, buf_(buf), formatter_(formatter)
   {
      setp(buffer_.begin(), buffer_.end() - 1);
   }
protected:
   virtual int overflow(int_type c = traits_type::eof()) override
   {
      *pptr() = traits_type::to_char_type(c);
      format();
      return traits_type::not_eof(c);
   }
 
   virtual int sync() override
   {
      format();
      return 0;
   }
private:
   void format()
   {
      const std::string value(buffer_.begin(), pptr() - buffer_.begin());
      const std::string formatted = formatter_(value);
      buf_->sputn(formatted.c_str(), formatted.size());
      setp(buffer_.begin(), buffer_.end());
   }
 
   std::array<char, 1024> buffer_;
   std::streambuf* buf_;
   formatter_t formatter_;
};
 
class formatting_ostream : public std::ostream
{
   typedef std::function<std::string(const std::string&)> formatter_t;
public:
   formatting_ostream(std::ostream& stream, const formatter_t& formatter) : 
      stream_(stream), old_buf_(stream_.rdbuf()), streambuf_(old_buf_, formatter)
   {
      init(&streambuf_);
   }
private:
   std::ostream& stream_;
   std::streambuf* old_buf_;
   formatting_streambuf streambuf_;
};
 
class source
{
public:
   source(std::ostream& stream) : stream_(stream)
   {
   }
 
   void print()
   {
      stream_ << "HeLlO" << std::endl;
   }
private:
   std::ostream& stream_;
};
 
int main()
{
   auto to_lower = [](const std::string& v) -> std::string
   {
      std::string result;
      std::transform(v.begin(), v.end(), std::back_inserter(result), tolower);
      return result;
   };
   formatting_ostream stream(std::cout, to_lower);
   source s(stream);
   s.print();
   s.print();
 
   source ss(std::cout);
   ss.print();
}
Добавлено через 6 минут
Пример работы
3
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
15.07.2015, 14:11  [ТС]
Вот, красота! Благодарен за помощь, если увижу в личке номера телефонов вас обоих - немного пополню баланс

п.с. отсутствие виртуальности где хотелось бы, конечно, удручает((( похоже пора срочно отвыкать от Java-подобного... или же наоборот никогда его от себя не отпускать...
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
15.07.2015, 14:33
Цитата Сообщение от ForEveR Посмотреть сообщение
Да и вообще
а для чего old_buf_ я не разобрался.. про запас)?
Цитата Сообщение от VVildVVolf Посмотреть сообщение
отсутствие виртуальности
о какой виртуальности речь
0
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
15.07.2015, 14:46  [ТС]
Ну как в Java, где практически любой метод можно переопределить (если он явно от этого не защищен). Но возможно это негодование только от незнания специфики языка

Добавлено через 7 минут
Кстати, теперь можно прокидывать для вывода другой ostream и делать многоступенчатую обработку =D
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
15.07.2015, 14:50
Цитата Сообщение от VVildVVolf Посмотреть сообщение
практически любой метод можно переопределить
ну и здесь можно любой метод переопределить если это технически было заложено в класс. просто STL так спроектирована что пришлось переопределять не то что в начале хотелось бы переопределить (хотелось переопределить << а пришлось лезть в буфера)

Добавлено через 1 минуту
спасибо за мотивацию!
0
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
15.07.2015, 14:52  [ТС]
Вот я и говорю, что надеюсь, что в плюсах сделать можно всё (пусть и неочевидным с первого раза) красивым и объектно-ориентированным способом))

на здоровье, мне не жалко за дело) надеюсь что таки меня возьмут на работу с вашей помощью ..
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.07.2015, 14:57
Цитата Сообщение от vxg Посмотреть сообщение
а для чего old_buf_ я не разобрался.. про запас)?
old_buf_ остался от того использования, когда я rdbuf у переданного стрима заменял. Сейчас можно просто послать stream_.rdbuf() в конструктор streambuf_. Нужен он, чтобы итоговая запись отформатированного текста ушла в нужный буфер.
0
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 09:58  [ТС]
Привет всем снова, тут проблема возникла, при передачи в CustomStreamBuf ссылки на ostream. Передаю туда cout - всё норм, всё выводит на консоль, передаю туда ofstream - пустой файл получаю... из-за чего такое может быть?

и заодно ещё почему-то файл не хочет создаваться вообще, если прописать вместо "out.txt" что-нить типа "/output/out.txt", т.е. во вложенной папке. где-то на этом форуме была тема про такое создание выходного поток, народ пишет что файл должен создаваться во вложенной папке... у меня не создаётся, даже если эту папку сам создам...
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
20.07.2015, 12:30
Цитата Сообщение от VVildVVolf Посмотреть сообщение
тут проблема
у меня работает
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
//---------------------------------------------------------------------------
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
#include <iostream>
#include <fstream>
#include <stdlib.h>
//---------------------------------------------------------------------------
class my_obj
{
public:
    void print(std::ostream &os)
    {
        os << 123 << std::endl;
    }
};
//---------------------------------------------------------------------------
class my_buf: public std::streambuf
{
private:
    std::ostream *ptr;
public:
    my_buf(std::ostream &os): ptr(&os) {}
private:
    std::string str;
    
protected:
    virtual int_type overflow(int_type __c = traits_type::eof())
    {
        str.append(1, traits_type::to_char_type(__c));
        return traits_type::not_eof(__c);
    }
 
    virtual int sync(void)
    {
        *ptr << str;
        str.clear();
        return 0;
    }
};
//---------------------------------------------------------------------------
class my_stream: public std::ostream
{
private:
    my_buf buf;
    
public:
    my_stream(std::ostream &os):
        std::ostream(0),
        buf(os)
    {
        this->init(&buf);
    }
};
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
    std::ofstream fos("12/out.txt");
    my_stream os(fos);
    my_obj obj;
    obj.print(os);
    obj.print(os);
    obj.print(os);
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.07.2015, 12:41
Цитата Сообщение от VVildVVolf Посмотреть сообщение
Привет всем снова, тут проблема возникла, при передачи в CustomStreamBuf ссылки на ostream. Передаю туда cout - всё норм, всё выводит на консоль, передаю туда ofstream - пустой файл получаю... из-за чего такое может быть?
std::endl при выводе используется? Если нет - работать не будет.
Мой код тот же, кроме fstream:

C++
1
2
   std::ofstream ofs("test_file.txt");
   formatting_ostream stream(ofs, to_lower);
Bash
1
2
3
4
cat test_file.txt 
hello
hello
HeLlO
2
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
20.07.2015, 13:07
Цитата Сообщение от ForEveR Посмотреть сообщение
Если нет - работать не будет
о ужас %/ зачем они сделали синк по эндл?? можно победить сделав руками флэш. ну или в оверфлоу ловить делители
0
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 13:12  [ТС]
на самом деле синк в моём конкретно случае мало волнует (не бейте меня, я его в деструкторе стрима вызываю...), и получается endl и '\n' не одно и тоже? попробую в конце принудительно заталкивать endl для верности... но при указании папки - так ничего не создаётся, ни на домашнем ноуте, ни на рабочей машинке, даже при запуске с правами админа...
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
20.07.2015, 13:45
Цитата Сообщение от VVildVVolf Посмотреть сообщение
я его в деструкторе стрима вызываю
так тоже можно. странно что он сам не вызывается. или может он вызывается но после того как поток файла убился. я всегда думал что эндл это просто вставка платформозависимого делителя. но наверное она еще и синк зовет. хз. зачем вам пихать эндл если все работает? или все еще не работает? у меня файл создается - почему у вас нет? может не нужно / ставить в голову?
0
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 13:52  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
или все еще не работает
не работает на 2х машинах причем файл не создаётся, и со слэшем, и без, и с "~/" и с "./" и всё тоже самое с обратными слэшами пробовал..

причем (если файл создаётся в той же папке, что и прога) такой код:
C++
1
2
3
4
5
6
7
ofstream output;
    output.open(outFileName);
 
    output<<"begin"<<endl;
    
    p = new Parser(output);
    output<<"end"<<endl;
генерит файл с текстом
begin
end
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
20.07.2015, 14:03
Цитата Сообщение от VVildVVolf Посмотреть сообщение
не работает
попробуйте абсолютный путь. может у вас рабочая папка какая-нибудь экзотическая при вызове
0
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 14:15  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
попробуйте абсолютный путь. может у вас рабочая папка какая-нибудь экзотическая при вызове
не, не даёт... это причем даже в отдельном проекте, где пытаюсь просто тупо в файл записать.

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <fstream>
 
using namespace std;
int main(){
    ofstream os2("C://lol/lout.txt");
    os2<<"tro"<<endl;
    os2.close();
    return 0;
}
вот это не создаёт файл ни по абсолютному, ни по относительному, только если тупо имя указать - в текущей и всё...
0
20.07.2015, 14:21

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
ои глаза! мои прекрасные глаза!! до сих пор не могу привыкнут к этим штукам. и никогда наверное не привыкну
Так же фигня, а уши уши ведь звучит как нецензурщина ....

0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
20.07.2015, 14:24
Цитата Сообщение от VVildVVolf Посмотреть сообщение
вот это не создаёт файл ни по абсолютному, ни по относительному, только если тупо имя указать - в текущей и всё
ну вы же понимаете что это невозможно)

Добавлено через 50 секунд
полагаю что то с правами или хз чем но не с программой. что то мне подсказывает что вам нужно попробовать порабоать в винде
0
82 / 1 / 0
Регистрация: 08.10.2012
Сообщений: 54
20.07.2015, 14:30  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
ну вы же понимаете что это невозможно)
я чего-то в упор не вижу(я что-то делаю так, что при этом невозможно создать файл), или невозможен факт несоздования файла с папкой?Оо если второе - готов поспорить)

Добавлено через 55 секунд
Цитата Сообщение от vxg Посмотреть сообщение
полагаю что то с правами или хз чем но не с программой. что то мне подсказывает что вам нужно попробовать порабоать в винде
Вы хотели сказать НЕ в винде?

Добавлено через 2 минуты
да и если б была проблема с правами,тогда б и в своей директории не разрешал создавать? я ведь и из-под диска C с правами админа запускал...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.07.2015, 14:30

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

перегрузка и наследование.
Помогите,пожалуйста. В этой задаче нужно сделать перегрузку и наследование. using System; using System.Collections.Generic; ...

Наследование + перегрузка
В общем вот код: class Program { static void Main(string args) { Class2 cl2 = new...

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

Наследование. Перегрузка операторов
Не понятно, почему компилятор ругается на 49 строку - &quot;отстутствует оператор &quot;++&quot;, соответствующий этим операндам&quot;. В производном...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 16.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru