Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
1

Скопировать поток в поток

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

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


Например

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2013, 01:06
Ответы с готовыми решениями:

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

Нужно переделать программу, которая создает поток.Родительский и вновь созданный поток должны распечатать десять строк
Напишите программу, которая создает поток. Используйте атрибуты по умолчанию. Родительский и вновь...

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

STL и поток
Есть вектор, объявленный в основной программе, состоящий из ссылок на компоненты типа TImage и...

15
DU
1500 / 1146 / 165
Регистрация: 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
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
24.10.2013, 01:28  [ТС] 3
нет.
нужно чтобы адреса различались.
У *P свой адрес
У out свой

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

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

я не знаю.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 01:38 4
перенаправление потоков - вещь хитрая (по крайней мере для меня). там муть с буферами ввода и т.д. и т.п.
может вам что-то другое нужно все-таки. попробуйте задачу в целом описать.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
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
1500 / 1146 / 165
Регистрация: 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
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
24.10.2013, 02:04  [ТС] 7
include <чего-то там> быть должно?

в таком виде у меня не компилируется
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
24.10.2013, 02:07 8
#include <memory>
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
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
1500 / 1146 / 165
Регистрация: 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
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
24.10.2013, 02:35  [ТС] 11
Ясно. спасибо.

т.к. сейчас не до конца понимаю этот вариант. есть вопрос.
Здесь потоки закрывать не нужно по аналогии с файловыми потоками?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.10.2013, 02:48 12
daslex, зачем вам нужно поток именно в функции создавать?
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
24.10.2013, 02:57  [ТС] 13
мне как бы и не нужно. Зачем может быть нужно понятия не имею.
просто знать хочу.
0
5498 / 4893 / 831
Регистрация: 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
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
24.10.2013, 03:08  [ТС] 16
В общем я не знал как, поэтому спросил как в голову пришло, чтобы было поближе к смыслу.

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

Не по теме:

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

0
24.10.2013, 03:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2013, 03:08
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru