12 / 12 / 2
Регистрация: 05.06.2016
Сообщений: 248
1

Потоки ввода вывода

27.06.2017, 02:12. Показов 1660. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Почему с помощью классов ostream и istream нельзя создавать свои потоки ввода вывода?
C++
1
2
std::ostream output;
output << "String";
К примеру если объект cout объявлен как "extern std::ostream cout", то почему я не могу создать свой объект типа std::ostream и выводить с помощью него информацию в терминал?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2017, 02:12
Ответы с готовыми решениями:

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода,...

Потоки ввода-вывода в С++
Ребят, нужна помощь В программирование я новичок, но сдать нужно 1. Написать программу,...

Потоки ввода/вывода
Здравствуйте! Расскажите мне пожалуйста подробнее о всех особенностях потоков ввода/вывода; в...

Потоки ввода-вывода
1) Типы данных, для которых перегружены операторы форматного ввода-вывода.

5
Заблокирован
27.06.2017, 02:18 2
http://ideone.com/ZJ7F6m
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main()
{
    std::ostream output(std::cout.rdbuf());
    output << "String";
}
0
12 / 12 / 2
Регистрация: 05.06.2016
Сообщений: 248
27.06.2017, 02:20  [ТС] 3
daun-autist, Гуглить я тоже умею, очевидно что в этом случае нужно подключать заголовочный файл iostream и использовать тот же самый объект cout, хотя сам cout как я уже сказал ранее и объявлен следующим образом "extern std::ostream cout", так всё-же почему я не могу создать свой объект типа std::ostream и выводить с помощью него информацию в терминал? (и вот я повторил свой вопрос)
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
27.06.2017, 03:56 4
Цитата Сообщение от nammidd Посмотреть сообщение
и объявлен следующим образом
это объявление значит, что вся реализация cout находится внутри библиотеки, а пользователям этого объекта выставлен лишь его интерфейс.

Добавлено через 1 час 20 минут
Конкретно в GCC этот объект инициализируется следующим образом:

ios_init.cc
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
  using namespace __gnu_internal;
 
  extern istream cin;
  extern ostream cout;
  extern ostream cerr;
  extern ostream clog;
 
#ifdef _GLIBCXX_USE_WCHAR_T
  extern wistream wcin;
  extern wostream wcout;
  extern wostream wcerr;
  extern wostream wclog;
#endif
 
 
  ios_base::Init::Init()
  {
    if (__gnu_cxx::__exchange_and_add_dispatch(&_S_refcount, 1) == 0)
      {
    // Standard streams default to synced with "C" operations.
    _S_synced_with_stdio = true;
 
    new (&buf_cout_sync) stdio_sync_filebuf<char>(stdout);
    new (&buf_cin_sync) stdio_sync_filebuf<char>(stdin);
    new (&buf_cerr_sync) stdio_sync_filebuf<char>(stderr);
 
    // The standard streams are constructed once only and never
    // destroyed.
    new (&cout) ostream(&buf_cout_sync);
    new (&cin) istream(&buf_cin_sync);
    new (&cerr) ostream(&buf_cerr_sync);
    new (&clog) ostream(&buf_cerr_sync);
    cin.tie(&cout);
    cerr.setf(ios_base::unitbuf);
    // _GLIBCXX_RESOLVE_LIB_DEFECTS
    // 455. cerr::tie() and wcerr::tie() are overspecified.
    cerr.tie(&cout);
 
#ifdef _GLIBCXX_USE_WCHAR_T
    new (&buf_wcout_sync) stdio_sync_filebuf<wchar_t>(stdout);
    new (&buf_wcin_sync) stdio_sync_filebuf<wchar_t>(stdin);
    new (&buf_wcerr_sync) stdio_sync_filebuf<wchar_t>(stderr);
 
    new (&wcout) wostream(&buf_wcout_sync);
    new (&wcin) wistream(&buf_wcin_sync);
    new (&wcerr) wostream(&buf_wcerr_sync);
    new (&wclog) wostream(&buf_wcerr_sync);
    wcin.tie(&wcout);
    wcerr.setf(ios_base::unitbuf);
    wcerr.tie(&wcout);
#endif
 
    // NB: Have to set refcount above one, so that standard
    // streams are not re-initialized with uses of ios_base::Init
    // besides <iostream> static object, ie just using <ios> with
    // ios_base::Init objects.
    __gnu_cxx::__atomic_add_dispatch(&_S_refcount, 1);
      }
  }
то есть фактически перенаправляется в stdout, который является макросом операционной системы.

Итого - поскольку в операционной системе всего одна реализация вывода данных в терминал, для реализации другого вывода в терминал нужно переписывать свою реализацию операционной системы. Если хочется своего варианта std::cout - нужно переписывать код который выше, т.е. свою стандартную библиотеку.

А если нужно всего лишь определить оператор вывода для сериализации своих структур - определяете функцию operator<< для std::ostream со своей структурой в качестве аргумента, а внутри - разбиваете структуру на элементарные типы данных и в поток кладёте именно их...
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
27.06.2017, 04:47 5
Цитата Сообщение от TRam_ Посмотреть сообщение
это объявление значит, что вся реализация cout находится внутри библиотеки, а пользователям этого объекта выставлен лишь его интерфейс.
TC просто пропустил в книге что объявлять имена с уже имеющими в стандарте с++ нельзя
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
27.06.2017, 07:24 6
Цитата Сообщение от nammidd Посмотреть сообщение
К примеру если объект cout объявлен как "extern std::ostream cout", то почему я не могу создать свой объект типа std::ostream и выводить с помощью него информацию в терминал?
Вероятно, Аллах запретил.
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
class CinStreambuf:public std::streambuf
{
public:
    CinStreambuf():stdOut(GetStdHandle(STD_OUTPUT_HANDLE)){}
    std::streamsize xsputn(const char*s,std::streamsize n)
    {
        DWORD count;
        WriteConsoleA(stdOut,s,n,&count,NULL);
        return n;
    }
    int overflow(int c=EOF)
    {
        char value=c;
        xsputn(&value,1);
        return c;
    }
 
private:
    HANDLE stdOut;
};
int main()
{
    CinStreambuf cinStreambuf;
    std::ostream stream(&cinStreambuf);
    stream<<1234;
}
0
27.06.2017, 07:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2017, 07:24
Помогаю со студенческими работами здесь

Используя потоки ввода/вывода в С++
Здравствуйте помогите организовать запись информации из массива объектов в класс, чтение данной...

Текстовые файлы и потоки ввода/вывода
Доброго времени суток. Уважаемый гуру, не могли бы вы мне помочь с решением данной программы....

Непонятная ошибка. Потоки ввода/вывода
Решал задачу и столкнулся с проблемой (первый день на c++ &quot;пишу&quot;) не пойму что за ошибка ...

Множественное наследование. Потоки ввода-вывода
Помогите на с++


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru