Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
daslex
1283 / 527 / 109
Регистрация: 02.08.2011
Сообщений: 2,749
#1

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

24.10.2013, 01:06. Просмотров 1032. Ответов 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2013, 01:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Скопировать поток в поток (C++):

Скопировать поток и добавить ошибки в поток - C++
Здорова господа! Есть задачка: &quot;Скопируйте поток объектов типа Name_and_address и вставьте в него столько ошибок, сколько сколько...

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. - C++
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде...

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

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

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

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

15
DU
1483 / 1129 / 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;
}
если нет, то вопрос неясен. вам перенаправление потоков нужно или что?
1
daslex
1283 / 527 / 109
Регистрация: 02.08.2011
Сообщений: 2,749
24.10.2013, 01:28  [ТС] #3
нет.
нужно чтобы адреса различались.
У *P свой адрес
У out свой

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

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

я не знаю.
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:38 #4
перенаправление потоков - вещь хитрая (по крайней мере для меня). там муть с буферами ввода и т.д. и т.п.
может вам что-то другое нужно все-таки. попробуйте задачу в целом описать.
1
daslex
1283 / 527 / 109
Регистрация: 02.08.2011
Сообщений: 2,749
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 минуту
Чтобы избежать падения нужно что-то сделать. Я и подумал: "если скопировать данные из одного потока в другой, модет быть получится"
0
DU
1483 / 1129 / 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.
0
daslex
1283 / 527 / 109
Регистрация: 02.08.2011
Сообщений: 2,749
24.10.2013, 02:04  [ТС] #7
include <чего-то там> быть должно?

в таком виде у меня не компилируется
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 02:07 #8
#include <memory>
1
daslex
1283 / 527 / 109
Регистрация: 02.08.2011
Сообщений: 2,749
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) ===|
0
DU
1483 / 1129 / 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;
}
0
daslex
1283 / 527 / 109
Регистрация: 02.08.2011
Сообщений: 2,749
24.10.2013, 02:35  [ТС] #11
Ясно. спасибо.

т.к. сейчас не до конца понимаю этот вариант. есть вопрос.
Здесь потоки закрывать не нужно по аналогии с файловыми потоками?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 02:48 #12
daslex, зачем вам нужно поток именно в функции создавать?
1
daslex
1283 / 527 / 109
Регистрация: 02.08.2011
Сообщений: 2,749
24.10.2013, 02:57  [ТС] #13
мне как бы и не нужно. Зачем может быть нужно понятия не имею.
просто знать хочу.
0
alsav22
5426 / 4821 / 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 Посмотреть сообщение
Чтобы избежать падения нужно что-то сделать.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
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!";
    }
}
1
24.10.2013, 03:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 03:03
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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