Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/40: Рейтинг темы: голосов - 40, средняя оценка - 4.95
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041

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

20.08.2013, 11:01. Показов 8524. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здорова господа!

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

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

Я так думаю сомому iostream создать это очень трудоемкий процесс, хотя мб просто спроэктировать и теоретически разобрать структуру, где что будет.
Мб кто уже решал????
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.08.2013, 11:01
Ответы с готовыми решениями:

Стандартные функции ввода/вывода языка Си
Приветствую всех.У меня проблема.Я решил попробовать функции ввода/вывода в стиле Си.Написал прогу которая должна выводить сумму a и b,но...

Библиотеки ввода вывода.
Доброе утро! Есть задача: Дан файл с текстом. Проверить, сколько раз в тексте встречается какой-либо отрезок ряда 0123456789 длины не...

Какой препроцессор используется для подключения стандартной библиотеки ввода-вывода?
Какой препроцессор используется для подключения стандартной библиотеки ввода-вывода? 1) include 2) iostream 3) define 4) io.sys

13
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.08.2013, 11:28
ninja2, Читаем стандарт - вникаем в суть - делаем примерно так же.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
20.08.2013, 21:25  [ТС]
А чем можно заменить функцию из <stdio.h> remove(имя_файла) - удаляет файл и rename(имя файла, новое имя файла). Чото я подобных функций из <iostream> не припомню.

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

Я вообще сделал FILE как fstream, короче typedef применил : typedef fstream File . Вроде как это дескриптор потока и через него уже ввожу или вывожу в файл, а через cin и cout считываю вывожу в поток ввода вывода.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
20.08.2013, 21:36

Не по теме:

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


Никакую, это часть синтаксиса языка.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
20.08.2013, 21:38
ninja2, remove/rename в STL действительно нет.
А printf/fprintf относительно просто. Для удобной работы с переменным кол-вом параметров - cstdarg.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
21.08.2013, 01:21  [ТС]
Короче 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 не сразу, а использовать видимо буфер???
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2013, 01:34
ninja2, cout - вывод в stdout.
cerr - вывод в stderr, небуферизованный.
clog - вывод в stderr.
Почитайте стандарт, реально, там все несколько сложнее, чем вы описываете.
0
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
21.08.2013, 01:44  [ТС]
Вроде догадался, наверно ostream нужно делать в виде шаблона с параметрами по умолчанию stdout, и когда будем создавать объект cerr, то переопределить параметр под stderr. Еще пока не сильно понятно как делать.

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

Цитата Сообщение от ForEveR Посмотреть сообщение
Почитайте стандарт, реально, там все несколько сложнее, чем вы описываете.
Да все правильно вроде я описал, похоже 4 класса нужно всего то создать.????
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2013, 08:41
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/c... _streambuf
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
21.08.2013, 13:27  [ТС]
Цитата Сообщение от 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 значит стрелочка должна быть?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2013, 14:30
ninja2, <iostream> он как бэ большой. streambuf не является левым классом, отнюдь. И тем более он не является typedef-ом на char. basic_streambuf - это шаблонный класс, который делает всю относительно низкоуровневую работу. В basic_ios хранится указатель на basic_streambuf, который в свою очередь является интерфейсом - практически все public функции вызывают защищенные виртуальные функции.
Мы что бы не делать левый класс streambuf упростим себе задачу буфер представим в виде typedef char* streambuf;
Бред же. Весь низкий уровень должен быть в streambuf, а никак не в ios.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
21.08.2013, 14:43  [ТС]
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 минуту
Да сделаю кое как на троечку, тройка тоже положительная оценка .
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.08.2013, 14:45
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.
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
21.08.2013, 15:22  [ТС]
Да пропущу это задание, там в стл один файл istream только 1к строк, а еще и остальные. Теоретически просто подумаю над тем как бы ее можно было б построить и структуру определю примерную да и все.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.08.2013, 15:22
Помогаю со студенческими работами здесь

Стандартные библиотеки
Всем привет! Как научиться правильно пользоваться стандартными библиотеками, чтоб не изобретать велосипед? Как узнать – есть уже такое...

Стандартные библиотеки с++
Здравствуйте. Существует ли источник, в котором можно узнать о содержимом стандартных библиотек c++ и их возможностях? Подскажите...

стандартные функции библиотеки <string.h>
Здравствуйте, товарищи порграммисты :gsmile: Помогите, пожалуйста, с написанием програмки на языке C . Дано: символьная строка...

Стандартные библиотеки С и С++ какую выбрать?
Здравствуйте! Изучаю С++ по книге Дейтел.Х и Дейтел.П Как программировать на С++, все дело в том что издание книги староватое, но очень...

Visual Studio не подключаются стандартные библиотеки
Проблема в 10й и 12й версии VS, не могу понять в чем проблема...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru