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

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

Восстановить пароль Регистрация
 
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
24.10.2013, 01:06     Скопировать поток в поток #1
Есть ли возможность скопировать один поток в другой.


Например

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     Скопировать поток в поток
Посмотрите здесь:

Поток. C++
поток C++
Поток stdin C++
Поток C++
C++ Поток с GetMessage
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 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
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
24.10.2013, 01:28  [ТС]     Скопировать поток в поток #3
нет.
нужно чтобы адреса различались.
У *P свой адрес
У out свой

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

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

я не знаю.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:38     Скопировать поток в поток #4
перенаправление потоков - вещь хитрая (по крайней мере для меня). там муть с буферами ввода и т.д. и т.п.
может вам что-то другое нужно все-таки. попробуйте задачу в целом описать.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
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
1477 / 1053 / 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
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
24.10.2013, 02:04  [ТС]     Скопировать поток в поток #7
include <чего-то там> быть должно?

в таком виде у меня не компилируется
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 02:07     Скопировать поток в поток #8
#include <memory>
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
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
1477 / 1053 / 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
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
24.10.2013, 02:35  [ТС]     Скопировать поток в поток #11
Ясно. спасибо.

т.к. сейчас не до конца понимаю этот вариант. есть вопрос.
Здесь потоки закрывать не нужно по аналогии с файловыми потоками?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 02:48     Скопировать поток в поток #12
daslex, зачем вам нужно поток именно в функции создавать?
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
24.10.2013, 02:57  [ТС]     Скопировать поток в поток #13
мне как бы и не нужно. Зачем может быть нужно понятия не имею.
просто знать хочу.
alsav22
5282 / 4801 / 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
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++ Поток
Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. C++
Скопировать поток и добавить ошибки в поток C++

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

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

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

Не по теме:

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

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

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