Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,601

Создание системы потокового ввода/вывода

25.12.2024, 23:57. Показов 1517. Ответов 10

Студворк — интернет-сервис помощи студентам
Здравствуйте! У Старуструпа есть такая задачка, вот её текст:
Напишите миниатюрную систему потокового ввода/вывода, предоставляющую классы istream, ostream, ifstream, ofstream, функции operator<<() и operator>>() для целых чисел и такие операции, как open() и close(), для файлов.
Ясно, что создания полноценной системы ввода-вывода никто не ожидает, но, если честно, то это задание поставило меня в тупик хз с чего начать... Поискав в интернете нашёл решение, попробовал его, всё работает, но в суть этой системы я так и не вник, а задание, видимо, для того и создано, что глубже понять как устроена стандартная система ввода-вывода. Короче говоря вот решение, которое я накопал в интернете(НЕ МОЁ):

Кликните здесь для просмотра всего текста
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
namespace ch21
{
    #undef EOF
 
    typedef size_t streamsize;
    typedef size_t streampos;
    typedef size_t streamoff;
 
    constexpr int EOF = -1;
 
    class ios_base
    {
    public:
        enum openmode { in = 0, out = 1 };
    };
 
    class streambuf
    {
    private:
        char* m_eback;
        char* m_gptr;
        char* m_egptr;
 
        char* m_pbase;
        char* m_pptr;
        char* m_epptr;
 
    public:
        streambuf() :m_eback(nullptr), m_gptr(nullptr), m_egptr(nullptr),
                     m_pbase(nullptr), m_pptr(nullptr), m_epptr(nullptr)
        {
 
        }
        ~streambuf() { }
 
        //buffer management
        streambuf* putsetbuf(char* s, streamsize n) { return setbuf(s, n); }
        int pubsync() { return sync(); }
 
        //input
        streamsize in_avail()
        {
            if (gptr() && gptr() < egptr())
                return egptr() - gptr();
            else
                return showmanyc();
        }
 
        int snextc()
        {
            if (!m_gptr || ++m_gptr == m_egptr)
                return uflow();
            return *m_gptr;
        }
 
        int sbumpc()
        {
            if (!m_gptr || m_gptr == m_egptr)
                return uflow();
            else
                return *(m_gptr++);
        }
 
        int sgetc()
        {
            if (!gptr() || gptr() == egptr())
            {
                return underflow();
            }
            else
            {
                return *m_gptr;
            }
        }
 
        //output
        int sputc(char c)
        {
            if (!pptr() || pptr() == epptr())
                return overflow(c);
            else
                return *(m_pptr++) = c;
        }
    protected:
        //input sequence
        char* eback() const { return m_eback; }
        char* gptr() const { return m_gptr; }
        char* egptr() const { return m_egptr; }
        void gbump(int n) { m_gptr += n; }
        void setg(char* gbeg, char* gnext, char* gend)
        {
            m_eback = gbeg; m_gptr = gnext; m_egptr = gend;
        }
 
        //output sequence
        char* pbase() const { return m_pbase; }
        char* pptr() const { return m_pptr; }
        char* epptr() const { return m_epptr; }
        void pbump(int n) { m_pptr += n; }
        void setp(char* pbeg, char* pend) { m_pptr = m_pbase = pbeg; m_epptr = pend; }
 
        //buffer management
        virtual streambuf* setbuf(char* s, streamsize n) = 0;
        virtual int sync() = 0;
 
        //input functions
        virtual streamsize showmanyc() = 0;
        virtual int underflow() = 0;
        virtual int uflow() = 0;
 
        //output functions
        virtual int overflow(int c = EOF) = 0;
    };
 
    class filebuf : public streambuf
    {
    private:
        char* buf;
        streamsize sz;
        //int fd;
        FILE* fd;
        ios_base::openmode mode;
 
    public:
        filebuf() :fd(nullptr), buf(0), sz(0) { setp(0, 0); }
        ~filebuf() { close(); }
 
        //file management
        filebuf* open(const char* s, ios_base::openmode mode)
        {
            this->mode = mode;
            errno_t er = 0;
            if (mode == ios_base::out)
                //fd = ::open(s, ios_base::out);
                er = ::fopen_s(&fd, s, "w");
            else
                //fd = ::open(s, ios_base::in);
                er = ::fopen_s(&fd, s, "r");
            //return fd >= 0 ? this : 0;
            return er == 0 ? this : 0;
        }
 
        filebuf* close()
        {
            if (fd != 0)
            {
                if (mode == ios_base::out && pptr() > pbase())
                    sync();
                //::close(fd);
                ::fclose(fd);
                return this;
            }
            else
                return 0;
        }
 
        streambuf* setbuf(char* s, streamsize n)
        {
            buf = s;
            sz = n;
            if (mode == ios_base::in)
                setg(0, 0, 0);
            else
                setp(buf, buf + sz);
            return this;
        }
 
        int sync()
        {
            if (!buf)
                return EOF;
            if (mode == ios_base::out)
            {
                //if (::write(fd, pbase(), pptr() - pbase()) < 0)
                const size_t count = pptr() - pbase();
                if((::fwrite(pbase(), sizeof(char), count, fd)) != count)
                    return EOF;
                setp(buf, buf + sz);    
            }
            return 0;
        }
 
        //input
        streamsize showmanyc() { return 0; }
        int underflow()
        {
            //int count = read(fd, buf, sz);
            int count = fread(buf, sizeof(char), sz, fd);
            if (count <= 0)
                return EOF;
            setg(buf, buf, buf + count);
            return *buf;
        }
 
        int uflow()
        {
            int ch = underflow();
            if (ch != EOF)
                gbump(1);
            return 0;
        }
 
        //output
        int overflow(int c = EOF)
        {
            if (mode == ios_base::out)
            {
                if (!buf)
                {
                    char ch = static_cast<char>(c);
                    //::write(fd, &ch, 1); //????
                    return fputc(ch, fd);
                }
                else
                {
                    sync();
                    return sputc(c);
                }
            }
            return 0;
        }
    };
 
    class ios : public ios_base
    {
    private:
        int state;
 
    public:
        enum iostate { eofbit = 1, failbit = 2 };
 
        ios() :state(0) { }
 
        bool good() { return !state; }
        bool eof() { return !(state & eofbit); }
        bool fail() { return !(state & failbit); }
        bool operator!() { return !good(); }
        operator void* () { return good() ? this : 0; }
        void clear() { state = 0; }
        void setstate(int f) { state = f; }
    };
 
 
    class ostream : public ios
    {
    private:
        streambuf* sb;
 
    public:
        explicit ostream(streambuf* _sb) :sb(_sb) { }
 
        ostream& operator<<(char c)
        {
            sb->sputc(c);
            return *this;
        }
 
        ostream& operator<<(std::string s)
        {
            for (size_t i = 0; i < s.size(); ++i)
                sb->sputc(s[i]);
            return *this;
        }
 
        ostream& operator<<(int x)
        {
            std::string tmp;
            if (x == 0)
                tmp.push_back('0');
            else
            {
                while (x > 0)
                {
                    tmp.push_back('0' + (x % 10));
                    x /= 10;
                }
                std::reverse(tmp.begin(), tmp.end());
            }
            *this << tmp;
            return *this;
        }
    };
 
    class istream : public ios
    {
    private:
        streambuf* sb;
 
    public:
        explicit istream(streambuf* _sb) :sb(_sb) { }
 
        istream& operator>>(char& c)
        {
            int ch = sb->sbumpc();
            if (ch == EOF)
                setstate(ios::eofbit);
            else
                c = ch;
            return *this;
        }
 
        istream& operator>>(int& x)
        {
            int ch;
            while (ch = sb->sgetc())
            {
                if (ch == EOF)
                {
                    setstate(ios::failbit | ios::eofbit);
                    break;
                }
                else if (isspace(ch))
                {
                    sb->sbumpc();
                    continue;
                }
                else if (isdigit(ch))
                {
                    x = ch - '0';
                    sb->sbumpc();
                    break;
                }
                setstate(ios::failbit);
                return *this;
            }
            while (ch = sb->sgetc())
            {
                if (ch == EOF)
                {
                    setstate(ios::eofbit);
                    break;
                }
                if (!isdigit(ch))
                    break;
                sb->sbumpc();
                x *= 10;
                x += ch - '0';
            }
            return *this;
        }
    };
 
    class ofstream : public ostream
    {
    private:
        filebuf fb;
        char buf[1024];
 
    public:
        explicit ofstream(const char* file) :ostream(&fb)
        {
            fb.setbuf(buf, 1024);
            fb.open(file, ios_base::out);
        }
 
        ~ofstream() { close(); }
        void close() { fb.close(); }
    };
 
    class ifstream : public istream
    {
    private:
        filebuf fb;
        char buf[1024];
    public:
        explicit ifstream(const char* file) :istream(&fb)
        {
            fb.setbuf(buf, 1024);
            fb.open(file, ios_base::in);
        }
 
        ~ifstream() { close(); }
        void close() { fb.close(); }
    };
}


Да, с файловыми потоками работает нормально, но как создать аналог cout, cin вот здесь я понял, что ничего не понял из того, что пишет про потоки ввода-вывода в главе 21 Страуструп. Суть в чём, что главное-центральное в этой системе - это буфер(streambuf)? Хорошо, если это так то, видимо, нужно создать свой буфер для потокового ввода-вывода что-то подобное filebuf в задании, ну, например, в этом буфере можно задать размер буфера, открыть консоль с которой и работать в дальнейшем или просто использовать функции Си для ввода вывода или это всё же совсем не то? Короче говоря, хочется понять что к чему, как это работает под капотом.
Хочу получить в результате что-то такое:
Code
1
2
ostream os;
os << 5 << " + " << 5 << " = ";
вывод в консоль:
Code
1
5 + 5 =
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.12.2024, 23:57
Ответы с готовыми решениями:

Библиотека потокового ввода/вывода
А верно ли, что данная библиотека является вещью абсолютно бесполезной для Windows-программирования и в настояящее время используется...

Функции потокового ввода/вывода
Подскажите, пожалуйста, чем отличается fwrite/fread от fprintf/fscanf?

Перегрузка потокового ввода/вывода
Вот сама перегрузка ostream&amp; operator&lt;&lt; (ostream&amp; out, Poli&amp; outstream) { out&lt;&lt;&quot;Степень полинома=&quot;&lt;&lt;outstream.n&lt;&lt;endl; ...

10
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
26.12.2024, 09:37
Вопрос-то в чем?

cout, cin - просто глобальные переменные файлового потока, которым при создании указано имя "файла" (устройства) консоли.
Ведь с точки зрения ОС консоль - это файл с предопределённым названием.
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,601
26.12.2024, 23:58  [ТС]
Если что-то подобное запилить, то мало-мальски что-то получается:
Кликните здесь для просмотра всего текста
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
94
95
96
97
98
99
100
101
102
103
class ostreambuf : public streambuf
    {
    private:
        char* buf;
        streamsize sz;
        FILE* fd;
        ios_base::openmode mode;
    public:
        ostreambuf() :buf(nullptr), sz(0), fd(nullptr) { setp(0, 0); }
        ~ostreambuf() { close(); }
 
        ostreambuf* open(const char* s, ios_base::openmode m)
        {
            this->mode = m;
            errno_t er = 0;
            if (m == ios_base::out)
                er = fopen_s(&fd, s, "w");
            else
                er = fopen_s(&fd, s, "r");
            fd = stdout;
            return er == 0 ? this : 0;
        }
 
 
        ostreambuf* close()
        {
            if (fd)
            {
                if (mode == ios_base::out && pptr() > pbase())
                    sync();
                ::fclose(fd);
                return this;
            }
            return 0;
        }
 
        //buffer management
        streambuf* setbuf(char* s, streamsize n)
        {
            buf = s;
            sz = n;
            if (mode == ios_base::in)
                setg(0, 0, 0);
            else
                setp(buf, buf + sz);
            return this;
        }
 
 
        int sync()
        {
            if (!buf)
                return EOF;
            if (mode == ios_base::out)
            {
                const size_t chcount = pptr() - pbase();
                //fwrite(buf, sizeof(char), chcount, &fd);
                if (fwrite(pbase(), sizeof(char), chcount, fd) < 0)
                    return EOF;
                setp(buf, buf + sz);
            }
            return 0;
        }
 
        streamsize showmanyc() { return 0; }
 
        int underflow()
        {
            int count = fscanf_s(fd, "%s", buf, sz);
            if (count <= 0)
                return EOF;
            setg(buf, buf, buf + sz);
            return *buf;
        }
 
        int uflow()
        {
            int ch = underflow();
            if (ch != EOF)
                gbump(1);
            return ch;
        }
 
 
        int overflow(int c = EOF)
        {
            if (mode == ios_base::out)
            {
                if (!buf)
                {
                    char ch = static_cast<char>(c);
                    fputc(ch, fd);
                }
                else
                {
                    sync();
                    sputc(c);
                }
            }
            return 0;
        }
 
    };

в main написать вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    //using namespace std;
    using namespace ch21;
    
 
    char b[2048];
    ostreambuf buf;
    buf.setbuf(b, 2048);
    buf.open("", ios_base::out);
    ostream os(&buf); //os == cout, чтобы не было неоднозначностей.
    os << 5 << "+";
 
    buf.close();}
Вывод есть, но как-то это коряво, нужно делать иначе, но как...

Цитата Сообщение от KSergey9 Посмотреть сообщение
cout, cin - просто глобальные переменные файлового потока, которым при создании указано имя "файла" (устройства) консоли.
Где указано, я вижу что-то подобное:
//....
Code
1
2
using ostream   = basic_ostream<char, char_traits<char>>;
__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2_IMPORT ostream cout;
//...
Ясно, что cout связан с консолью, но как и где именно эта связь устанавливается, для классов ifstream/ofstream - всё относительно ясно, основная работа выполняется в буфере filebuf, а вот с cout и cin не всё так очевидно(

Короче говоря данный проект изначально проектировался лишь для ввода-вывода в файлы, видимо, нужно изначально проектировать иначе.

Цитата Сообщение от KSergey9 Посмотреть сообщение
Вопрос-то в чем?
Для начала, правильно ли изначально спроектирован проект, которые я выложил или его нужно менять полностью? streambuf - в стандартной библиотеке тоже абстрактный класс? Если я правильно уловил суть, то в стандартной библиотеке присутствуют два конкретных буфера унаследованных от streambuf это filebuf и stringbuf? У Страуструпа написано, что связь между потоком и его буфером должна поддерживаться в классе base_ios, но не хочется сильно усложнять проект, возможно нужно именно так и делать, возможно, это и есть ошибка...
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
28.12.2024, 17:20
Цитата Сообщение от Liss29 Посмотреть сообщение
Где указано
В реализации стандартной библиотеки (то, что ты видишь, - это тока определение).

Цитата Сообщение от Liss29 Посмотреть сообщение
но как и где именно эта связь устанавливается
На форуме примеры были - Как создать свой поток и связать его с консолью

Добавлено через 12 минут
Цитата Сообщение от Liss29 Посмотреть сообщение
Вывод есть, но как-то это коряво, нужно делать иначе, но как...
Вообще я б тебе сказал так - надо отталкиваться от задачи. Твой вопрос нельзя решить хорошо в сферическом вакууме.
Этот вот момент с написанием своего буфера, и аналогично написание своего аллокатора, очень специфический и появляется тока в определенных условиях. Эти условия и диктуют как должно выглядеть решение.

Так шта криво - не криво, это все ерунда. Главное знать инструментарий. А когда придет время - смочь написать решение под конкретные реальные условия.
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,601
28.12.2024, 23:58  [ТС]
Цитата Сообщение от ablex Посмотреть сообщение
На форуме примеры были
В данном случае я что-то подобное проделал, не совсем как в примере из ссылки, но что-то похожее как я написал выше меня такой вариант не устроил, но судя по всему чтобы добиться того чего хочу я, нужно написать ещё много-много кода, пример разрастается. Думаю, что на данном этапе я его оставлю, хотя не до конца я понял как там внутри всё работает.

Цитата Сообщение от ablex Посмотреть сообщение
надо отталкиваться от задачи
Я задачу описал в первом посте, это то, что хочет Страуструп, но я ни малейшего представления не имею, как решить её с нуля.

Цитата Сообщение от ablex Посмотреть сообщение
Этот вот момент с написанием своего буфера
Это ради тренировки да и то скопирована из stl правда урезана, но всё же, не оригинальное решение, второй буфер, видимо, тоже был тупо скопирован или подогнан под урезанную версию библиотеки, повторюсь особого смысла здесь нет, разве что попытаться понять как ввод-вывод работает под капотом для тех, кто этого не знает-стакивается с подобным впервые(изучение-написание своих потоков вывода). Соответственно сформулировать что-то внятное сложно.

Цитата Сообщение от ablex Посмотреть сообщение
Так шта криво - не криво, это все ерунда. Главное знать инструментарий.
Согласен, в этом и суть.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
29.12.2024, 00:04
Цитата Сообщение от Liss29 Посмотреть сообщение
Я задачу описал в первом посте, это то, что хочет Страуструп, но я ни малейшего представления не имею, как решить её с нуля.
Это не задача. Это просто упражнение.

У задачи всегда есть реальные требования, условия и ограничения, а не выдуманные.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,601
29.12.2024, 00:22  [ТС]
Цитата Сообщение от ablex Посмотреть сообщение
У задачи всегда есть реальные требования, условия и ограничения, а не выдуманные.
Вот именно, это упражнение(я называю упражнение задачей, не более, для меня это задача), если предъявлять требования, условия, ограничения ..., то тогда это уже полноценный проект получиться. А так он как бы говорит: "У вас руки развязаны, делайте так как считаете нужным". Всё остальное на совести того, кто выполняет данное упражнение.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
29.12.2024, 19:48
Цитата Сообщение от Liss29 Посмотреть сообщение
если предъявлять требования, условия, ограничения ..., то тогда это уже полноценный проект получиться.
Блин, братан, следи за мыслью...

Цитата Сообщение от Liss29 Посмотреть сообщение
как-то это коряво,
Цитата Сообщение от ablex Посмотреть сообщение
Этот вот момент с написанием своего буфера, и аналогично написание своего аллокатора, очень специфический и появляется тока в определенных условиях.
Цитата Сообщение от ablex Посмотреть сообщение
У задачи всегда есть реальные требования, условия и ограничения
Типа не надо ничего предъявлять. Ты сетуешь, что у тебя коряво, а я те говорю, что в вакууме будет коряво в ЛЮБОМ случае, ибо задачи нет. Есть тока упражнение, в котором нет никаких реальных требований.

НеКОРЯВОСТЬ, будет тока в том случае, если твое решение фиксит проблематику конкретной задачи. Вот и всё. Если фиксит хорошо - значит не коряво. А в вакууме, в упражнениях, как оценить хорошо или нет, если требований нет? Вот о чём я толкую тебе.

Короче не парься. Тебе надо изучить инструмент, а корвость-некорявость тебя должна волновать тока в реальных задачах, а не выдуманных.

Добавлено через 3 минуты
Кстати про изучение инструмента...
Небезызвестный droffset вот тута оставлял список, и там есть занятная книженция (я о ней оттуда и узнал).
Angelika Langer, Klaus Kreft, - "Standard C++ IOStreams and Locales".
Книжка на инглише, но там всё есть про потоки.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,601
02.01.2025, 13:24  [ТС]
Цитата Сообщение от ablex Посмотреть сообщение
Вот о чём я толкую тебе.
Я толкую о том, что толку от требований, спецификаций, если не понятно как это вообще в общем делается, с чего начать, как это работает... вроде бы всё ясно, если взглянуть на картинку иерархии классов, но как это работает - магия да и только, ты говоришь про детали, а я о картине в общем.
Цитата Сообщение от ablex Посмотреть сообщение
Ты сетуешь, что у тебя коряво, а я те говорю, что в вакууме будет коряво в ЛЮБОМ случае, ибо задачи нет. Есть тока упражнение, в котором нет никаких реальных требований.
Всё нормально, у тебя свой взгляд на данный вопрос, видимо, взгляд проф. программиста, я же смотрю взглядом человека, который столкнулся с реализацией подобного впервые, я бывало и ранее заглядывал в файлы официального iostream, но быстро закрывал его в ужасе от его содержимого, а тут нужно не просто взглянуть, но и реализовать что-то подобное. К чему я это, а к тому, что мы по разному смотрим на одно и тоже, мне бы никакие дополнительные требования не помогли!

Не по теме:

В этой же главе есть ещё одно задание, из текста не ясно, что имеется ввиду, вот оно:

Реализуйте версии istream и ostream, которые читают и записывают числа в бинарном формате, а не переводят их в символы. Обсудите достоинства и недостатки такого подхода по сравнению со стандартным (символьным) подходом.
В смысле в бинарном формате, это что значит бинарный формат файлового ввода-вывода, ну, например, как в официальной библиотеке
Code
1
fstream fout("filename.txt", std::ios::binary)
или всё таки нужно вводит-выводить и хранить числа в двоичном виде, например так,
Code
1
2
MyInput >> bits;
MyOutput << 10110111;

0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
02.01.2025, 13:38
Цитата Сообщение от Liss29 Посмотреть сообщение
К чему я это, а к тому, что мы по разному смотрим на одно и тоже, мне бы никакие дополнительные требования не помогли!
Скачай книгу, которую я выше предложил.

Цитата Сообщение от Liss29 Посмотреть сообщение
если не понятно как это вообще в общем делается, с чего начать, как это работает...
Вот именно. Я тебе и говорю: у тебя коряво получится в любой случае, поэтому нефиг даже думать об этом. Разбирайся в механизмах (книга в помощь).

Добавлено через 2 минуты
Цитата Сообщение от Liss29 Посмотреть сообщение
В смысле в бинарном формате
В реализации operator<< должен быть код, который запишет в файл в бинарном формате.
В бинарном формате - это значит, что "не нужно переводить в текст". То есть если у тебя передается в operator<< переменная типа int, то в файле должны оказаться биты этой переменной, а не её текстовое представление.
1
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,601
02.01.2025, 16:12  [ТС]
Цитата Сообщение от ablex Посмотреть сообщение
Разбирайся в механизмах (книга в помощь).
Книга на английском и это проблема тут на родном не всегда всё понятно, а уж на буржуинском и подавно не понятно будет, и всякие там гугл-переводчики не особо помогают.


Цитата Сообщение от ablex Посмотреть сообщение
В бинарном формате - это значит, что "не нужно переводить в текст". То есть если у тебя передается в operator<< переменная типа int, то в файле должны оказаться биты этой переменной, а не её текстовое представление.
Теперь ясно, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.01.2025, 16:12
Помогаю со студенческими работами здесь

Перегрузка потокового ввода-вывода
Доброго времени суток!!! Возникла такая проблема: необходимо сделать перегрузку операций &lt;&lt; и &gt;&gt;. Вот что у меня есть: ...

Итераторы потокового ввода/вывода stl
Возник такой вопрос при изучении stl. Берем файл, из которого нужно считать данные, через copy записываем в вектор, но может мне кто-нибудь...

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

Перегрузка операторов потокового ввода вывода
Есть класс &quot;деканат&quot;, полем которого есть список студентов, объектов из класса &quot;Студент&quot;. Как переопределяя операторы...

Вызов функции потокового ввода-вывода со всеми параметрами
Всем здравствуйте. В классе fstream есть функция void open(const char *fileName, int mode, int protection); С первыми двумя...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru