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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
#1

Скопировать поток в поток - C++

24.10.2013, 01:06. Просмотров 910. Ответов 15
Метки нет (Все метки)

Есть ли возможность скопировать один поток в другой.


Например

C++
1
2
3
4
5
int main()
{
   ofstream (*P) = new ofstream;
   ofstream out("C:\123.txt");
}
и нужно, чтобы поток out был скопирован в поток, на который указывает указатель.

Не по теме:

возможно трактовка неправильно поставлена, но надеюсь чего я хочу узнать понятно.



в общем чтобы можно было делать как-то так
C++
1
2
3
4
5
6
int main()
{
   ofstream (*P) = new ofstream;
   ofstream out("C:\123.txt");
      *P<<555;
}
Добавлено через 1 минуту
и 555 записывалось в 123.txt
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2013, 01:06     Скопировать поток в поток
Посмотрите здесь:

поток (stream) - C++
расскажите подробно про работу потока

Поток с GetMessage - C++
Привет всем. У меня в программе в отдельном потоке имеется такой код: while(GetMessage(&amp;msg,0,0,0) { TranslateMessage(&amp;msg); ...

Очистить поток - C++
Хотел с помощью куска кода (см.ниже) очистить буфер связанный с потоком cin. Но выражение в скобках по какой-то причине не изменяется? ...

Указатель на поток - C++
void qwe(ifstream *file) { int ch; (*file) &gt;&gt; ch; } int main() { ifstream ifile (&quot;abc.txt&quot;); ...

STL и поток - C++
Есть вектор, объявленный в основной программе, состоящий из ссылок на компоненты типа TImage и TCheckBox: struct mass { TImage *img; ...

Поток и принтер - C++
1. Имеет ли дефолтный принтер стандартный поток? Если имеет, то как его зовут? Надо ли его открывать/закрывать? 2. Можно ли к дефольному...

Данные в поток - C++
Ув. профи ,не подскажите ли , Как данные находящиеся в (LPCVOID)pdib и размером dwSize запихнуть в поток, для последующего чтения....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:25     Скопировать поток в поток #2
так чтоли?
C++
1
2
3
4
5
6
int main()
{
   ofstream out("C:\123.txt");
   ofstream* P = &out;
   *P<<555;
}
если нет, то вопрос неясен. вам перенаправление потоков нужно или что?
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
24.10.2013, 01:28  [ТС]     Скопировать поток в поток #3
нет.
нужно чтобы адреса различались.
У *P свой адрес
У out свой

а это вот сейчас не копирование совсем.

Добавлено через 1 минуту
Цитата Сообщение от DU Посмотреть сообщение
перенаправление потоков нужно или что?
наверное.

я не знаю.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:38     Скопировать поток в поток #4
перенаправление потоков - вещь хитрая (по крайней мере для меня). там муть с буферами ввода и т.д. и т.п.
может вам что-то другое нужно все-таки. попробуйте задачу в целом описать.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
24.10.2013, 01:52  [ТС]     Скопировать поток в поток #5
Наверное кодом объяснить проще чем словами

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void myfunc(ofstream *&P)
{
    ofstream out("C:/123.txt"); //может слеш перепутан, это неважно сейчас    
    P=&out; //теперь если out уничтожится, P указывает вникуда
       
} //вот и все, P указывает вникуда 
 
 
void func2(ofstream *P)
{
    *P<<555; 
}
 
int main() {    
   ofstream *P = new ofstream;
      myfunc(P); //по завершению P вникуда
      func2(P);  //упали
 
return 0;
}
Добавлено через 1 минуту
Чтобы избежать падения нужно что-то сделать. Я и подумал: "если скопировать данные из одного потока в другой, модет быть получится"
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 02:01     Скопировать поток в поток #6
смарт-поинтеры возможно вам помогут:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef std::unique_ptr<std::ostream> OStreamPtr;
 
void myfunc(OStreamPtr& p)
{
  p.reset(new std::ofstream("C:/123.txt"));
}
 
void func2(std::ostream& P)
{
  P << 555; 
}
 
int main() {    
  OStreamPtr P; // пока никуда не указываем.
  myfunc(P);
  func2(*P); // если внутри не пересоздается стрим, то передаем просто по ссылке, иначе - ссылку на smartptr
  return 0;
}
можно еще std::shared_ptr. но для приведенного кода это лишнее. прокатит и std::unique_ptr.
если в рамках старого стандарта, то пойдет и std::auto_ptr вместо std::unique_ptr.
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
24.10.2013, 02:04  [ТС]     Скопировать поток в поток #7
include <чего-то там> быть должно?

в таком виде у меня не компилируется
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 02:07     Скопировать поток в поток #8
#include <memory>
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
24.10.2013, 02:12  [ТС]     Скопировать поток в поток #9
C:\CPP\MyProject\MyProjectFile\MyCPP.cpp|8|error: 'unique_ptr' in namespace 'std' does not name a type|
C:\CPP\MyProject\MyProjectFile\MyCPP.cpp|10|error: variable or field 'myfunc' declared void|
C:\CPP\MyProject\MyProjectFile\MyCPP.cpp|10|error: 'OStreamPtr' was not declared in this scope|
C:\CPP\MyProject\MyProjectFile\MyCPP.cpp|10|error: 'p' was not declared in this scope|
C:\CPP\MyProject\MyProjectFile\MyCPP.cpp||In function 'int main()':|
C:\CPP\MyProject\MyProjectFile\MyCPP.cpp|21|error: 'OStreamPtr' was not declared in this scope|
C:\CPP\MyProject\MyProjectFile\MyCPP.cpp|21|error: expected ';' before 'P'|
C:\CPP\MyProject\MyProjectFile\MyCPP.cpp|22|error: 'P' was not declared in this scope|
C:\CPP\MyProject\MyProjectFile\MyCPP.cpp|22|error: 'myfunc' was not declared in this scope|
||=== Build finished: 8 errors, 0 warnings (0 minutes, 2 seconds) ===|
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 02:15     Скопировать поток в поток #10
ну хз что вы там написали и хз какой у вас компилятор. я написал, что если стандарт старый - то auto_ptr:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <fstream>
#include <memory>
 
//typedef std::unique_ptr<std::ostream> OStreamPtr;
typedef std::auto_ptr<std::ostream> OStreamPtr;
 
void myfunc(OStreamPtr& p)
{
  p.reset(new std::ofstream("C:/123.txt"));
}
 
void func2(std::ostream& P)
{
  P << 555; 
}
 
int main()
{
  OStreamPtr P; // пока никуда не указываем.
  myfunc(P);
  func2(*P); // если внутри не пересоздается стрим, то передаем просто по ссылке, иначе - ссылку на smartptr
  return 0;
}
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
24.10.2013, 02:35  [ТС]     Скопировать поток в поток #11
Ясно. спасибо.

т.к. сейчас не до конца понимаю этот вариант. есть вопрос.
Здесь потоки закрывать не нужно по аналогии с файловыми потоками?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 02:48     Скопировать поток в поток #12
daslex, зачем вам нужно поток именно в функции создавать?
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
24.10.2013, 02:57  [ТС]     Скопировать поток в поток #13
мне как бы и не нужно. Зачем может быть нужно понятия не имею.
просто знать хочу.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 02:58     Скопировать поток в поток #14
Или такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ofstream* myfunc()
{
    ofstream *P = new ofstream("C:/123.txt");
    return P;
} 
 
 
void func2(ofstream *P)
{
    *P << 555; 
}
 
 
int main()
{
    ofstream *P = myfunc();
    func2(P); 
    
    delete P;
}
Добавлено через 58 секунд
Цитата Сообщение от daslex Посмотреть сообщение
просто знать хочу
Можно ли копировать потоки? Или это?:
Цитата Сообщение от daslex Посмотреть сообщение
Чтобы избежать падения нужно что-то сделать.
MrGluck
Модератор
Эксперт CЭксперт С++
6997 / 4168 / 594
Регистрация: 29.11.2010
Сообщений: 11,050
24.10.2013, 03:03     Скопировать поток в поток #15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
#include <vector>
 
int main()
{
    std::ofstream ofs("output.txt");
    std::vector<std::streambuf *> v;
    v.push_back(std::cout.rdbuf());
    v.push_back(ofs.rdbuf());
 
    std::ostream out(*v.begin());
    for (std::vector<std::streambuf *>::iterator it = v.begin(); it != v.end(); ++it)
    {
        out.rdbuf(*it);
        out << "Hello world!";
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 03:08     Скопировать поток в поток
Еще ссылки по теме:

Не работает поток - C++
Всем доброго времени суток. Ниже представлен код программы, считывающей инф. о пользователе с файла. Проблема: После считывания...

Поток cin - C++
Ребят подскажите почему после того как в цикле для потока cin устанавливается по команде Ctrl+z бит eofbit я не могу юзать поток cin он у...

Поток stdin - C++
Доброго времени суток. Ситуация следующая: пытаюсь расширить свои знания в программировании на С++, поэтому начал читать книгу Коплиена...

Перегрузка вывода в поток - C++
Есть клас вектор подскажите как сделать вывод в поток в виде дружественых функций например cout &lt;&lt; V &lt;&lt; “\n”; // выведет = 10, = 11...

Запись строк в поток - C++
if((f=fopen(&quot;d://Scanners.bin&quot;,&quot;a&quot;))=0) cout&lt;&lt;&quot;Fail&quot;; ..... //формирование строки тип char if (fputs(rec.model,f)!=EOF)...


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

Или воспользуйтесь поиском по форуму:
daslex
1271 / 516 / 106
Регистрация: 02.08.2011
Сообщений: 2,662
24.10.2013, 03:08  [ТС]     Скопировать поток в поток #16
В общем я не знал как, поэтому спросил как в голову пришло, чтобы было поближе к смыслу.

Спросил - узнал более чем 2 варианта. Цель более чем достигнута.
Знание получено.

Не по теме:

у меня кнопки спасибо закончились. как появятся нажму.

Yandex
Объявления
24.10.2013, 03:08     Скопировать поток в поток
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru