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

Стандартные библиотеки ввода/вывода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
20.08.2013, 11:01     Стандартные библиотеки ввода/вывода #1
Здорова господа!

Есть задание: "Нужно реализовать стандартную библиотеку ввода/вывода языка Си <stdio.h> используя <iostream> и наоборот реализовать <iostream> используя <stdio.h>, и еще они должны одновременно работать."

Я даже незнаю с чего и начать? Наверно с stdio.h начну, но там штук 30 функций. хз мб штук 10 реализую.
stdio.h еще куда нешло там вроде просто набор функций, а от iostream тут уже посложнее, тут нужно как то спроэктировать весь набор классов зависимости. ios класс создать.

Я так думаю сомому iostream создать это очень трудоемкий процесс, хотя мб просто спроэктировать и теоретически разобрать структуру, где что будет.
Мб кто уже решал????
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.08.2013, 11:28     Стандартные библиотеки ввода/вывода #2
ninja2, Читаем стандарт - вникаем в суть - делаем примерно так же.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
20.08.2013, 21:25  [ТС]     Стандартные библиотеки ввода/вывода #3
А чем можно заменить функцию из <stdio.h> remove(имя_файла) - удаляет файл и rename(имя файла, новое имя файла). Чото я подобных функций из <iostream> не припомню.

Добавлено через 12 минут
И printf и fprintf тоже переопределить не так просто, забыл какую библиотеку подключить для разного количества аргументов.

Я вообще сделал FILE как fstream, короче typedef применил : typedef fstream File . Вроде как это дескриптор потока и через него уже ввожу или вывожу в файл, а через cin и cout считываю вывожу в поток ввода вывода.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
20.08.2013, 21:36     Стандартные библиотеки ввода/вывода #4

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
забыл какую библиотеку подключить для разного количества аргументов.
Ее надо скачать и она платная


Никакую, это часть синтаксиса языка.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.08.2013, 21:38     Стандартные библиотеки ввода/вывода #5
ninja2, remove/rename в STL действительно нет.
А printf/fprintf относительно просто. Для удобной работы с переменным кол-вом параметров - cstdarg.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
21.08.2013, 01:21  [ТС]     Стандартные библиотеки ввода/вывода #6
Короче mystdio.h кое как написал, функций 15 переопределил, не сильно сложное задание, а от с <iostream> тут уже потруднее. Я вообще заглянул в эту библиотеку, там всего 4 объекта (не берем с w) cout,cin,clog,cerr. cout - это объект ostream, cin - объект istream, cerr - тоже объект ostream и clog - ostream.
Давайте разберемся чем отличаются cout, cerr и clog. cout использует буферизацию , cerr сразу выводит ошибку без буфера, ну это я так думаю, просто использовал cerr и cout так cerr сразу выводило ошибку а cout вроде не выводило. А clog я вообще вроде не использовал или мб не помню,хз. зачем он нужен?

Теперь поговорим о самой иерархии классов. Из <iostream> видно что он использует объекты двух классов istream и iostream, значит нам нужно построить всего лишь два этих класса. Я так глянул вроде базовый класс идет ios_base затем ios а уже от ios идут iostream и ostream, ну в принципе логично ios это состояние input output state переводится как состояние выходного входного потока.
Походу нужно создать всего 4 класса ios_base ios istream и ostream?

От еще что не понятно допустим создал я эти классы и как же я сделаю ostream cerr который будет выводить данные в поток сразу, а ostream cout не сразу, а использовать видимо буфер???
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2013, 01:34     Стандартные библиотеки ввода/вывода #7
ninja2, cout - вывод в stdout.
cerr - вывод в stderr, небуферизованный.
clog - вывод в stderr.
Почитайте стандарт, реально, там все несколько сложнее, чем вы описываете.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
21.08.2013, 01:44  [ТС]     Стандартные библиотеки ввода/вывода #8
Вроде догадался, наверно ostream нужно делать в виде шаблона с параметрами по умолчанию stdout, и когда будем создавать объект cerr, то переопределить параметр под stderr. Еще пока не сильно понятно как делать.

А иерархию классов правильно ж определил? Отут от вроде так как я написал для iostrem http://www.cplusplus.com/reference/istream/istream/ и для ostream http://www.cplusplus.com/reference/ostream/ostream/ ?????

Цитата Сообщение от ForEveR Посмотреть сообщение
Почитайте стандарт, реально, там все несколько сложнее, чем вы описываете.
Да все правильно вроде я описал, похоже 4 класса нужно всего то создать.????
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2013, 08:41     Стандартные библиотеки ввода/вывода #9
ninja2, Нет. Почитайте же. http://en.cppreference.com/w/cpp/io/cout http://en.cppreference.com/w/cpp/io/cerr. ostream работает с streambuf*, streambuf - базовый класс для всех работ с буфером и т.д. http://en.cppreference.com/w/cpp/io/basic_streambuf
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
21.08.2013, 13:27  [ТС]     Стандартные библиотеки ввода/вывода #10
Цитата Сообщение от ForEveR Посмотреть сообщение
ostream работает с streambuf*, streambuf - базовый класс для всех работ с буфером и т.д.
streambuf это левый класс для работы с буфером не входящий в <iostream>, от из схемы взаимодействия классов видно что он сам по себе: http://www.cplusplus.com/reference/iolibrary/ .

В ios есть функции для работы с буфером ios::rdbuf() которая возвращает указатель на streambuf* , видимо в самом классе ios должно быть typedef char* streambuf, но на самом деле:
C++
1
2
3
char str[]="hellow world";
    char* p=str;
    streambuf* buf=p;ошибка
неработает.
Значит нету typedef char* streambuf;

Не понятно как оно там на самом деле, но буфер должна быть обычная строка типа char* которая допустим содержится в ios, потому что там собраны функции для работы с буфером, а streambuf это класс для обработки этой строки, это так представляется. Еще пробовал вывести буфер:
C++
1
2
3
4
5
6
7
char str[]="hellow world";
    
    cout <<str;
    streambuf* buf=cout.rdbuf();
    cout <<"buf= "<<buf<<endl;//есби без преобразования то ошибка   
 
    cout <<"end"<<endl;
тоже не выводит.

Не знаю как оно там взаимодействует но буфер это строка, например в классе ios должен быть указатель на char* buff; На самом деле в реальной стл там указатель на streambuf* buf; что то такое и streambuf это не typedef char streambuf, а класс внутреннее представление которого указатель на char* и он просто предоставляет интерфейс для работы с этой строкой (так сказать буфером), и еще в streambuf похоже нету конструктора преобразования для char* и оператора преобразования типа operator char* () потому что он просто в поток не выводится. Это видно из поведения streambfu, мб и ошибаюсь.

Мы что бы не делать левый класс streambuf упростим себе задачу буфер представим в виде typedef char* streambuf;

Да и что то я сомневаюсь что то что я выше написал соответствует действительности, потому что на схеме взаимодействия классов по ссылке выше почему то нету стрелочки от ios к streambuf, которая показывала что класс ios имеет класс streambaf,хотя rdbuf возвращает указатель на streambuf значит стрелочка должна быть?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2013, 14:30     Стандартные библиотеки ввода/вывода #11
ninja2, <iostream> он как бэ большой. streambuf не является левым классом, отнюдь. И тем более он не является typedef-ом на char. basic_streambuf - это шаблонный класс, который делает всю относительно низкоуровневую работу. В basic_ios хранится указатель на basic_streambuf, который в свою очередь является интерфейсом - практически все public функции вызывают защищенные виртуальные функции.
Мы что бы не делать левый класс streambuf упростим себе задачу буфер представим в виде typedef char* streambuf;
Бред же. Весь низкий уровень должен быть в streambuf, а никак не в ios.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
21.08.2013, 14:43  [ТС]     Стандартные библиотеки ввода/вывода #12
ForEveR, Сложное задание, да не сделаю я его с буфером похоже. Даже если я готовый streambuf добавлю в класс ios_base я не сильно понимаю как его использовать например в этом классе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef ISTREAM_H
#define ISTREAM_H
 
#include <stdio.h>
#include <streambuf>
using std::streambuf;
 
#include "ios.h";
 
class istream : public ios
{
public:
    istream& operator>>(char* s){scanf("%s",s);return *this;}
    istream& operator>>(char &c){scanf("%c",&c);return *this;}
    istream& operator>>(int &n){scanf("%d",&n);return *this;}
 
};
 
#endif
Не знаю что и делать, наверно без буфера наваяю что нить по быстрому создам myiostrem файл и объекты mycin, mycot, mycerr.
Для меня это задание похоже тяжелое.

Добавлено через 1 минуту
Да сделаю кое как на троечку, тройка тоже положительная оценка .
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2013, 14:45     Стандартные библиотеки ввода/вывода #13
ninja2, Как это сделано в gcc -
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
  extern istream cin;
  extern ostream cout;
  extern ostream cerr;
  extern ostream clog;
 
  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);
Где stdio_sync_filebuf - абстракция над __cfile, сам данный класс - наследник basic_streambuf.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 15:22     Стандартные библиотеки ввода/вывода
Еще ссылки по теме:

Visual Studio не подключаются стандартные библиотеки C++
Стандартные функции ввода/вывода языка Си C++
Где находятся стандартные библиотеки c++ типа <math.h> C++

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

Или воспользуйтесь поиском по форуму:
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
21.08.2013, 15:22  [ТС]     Стандартные библиотеки ввода/вывода #14
Да пропущу это задание, там в стл один файл istream только 1к строк, а еще и остальные. Теоретически просто подумаю над тем как бы ее можно было б построить и структуру определю примерную да и все.
Yandex
Объявления
21.08.2013, 15:22     Стандартные библиотеки ввода/вывода
Ответ Создать тему
Опции темы

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