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

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

Войти
Регистрация
Восстановить пароль
 
Aндерсон_256
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 16
#1

Присваивание объекта класса ofstream - C++

08.03.2014, 18:01. Просмотров 763. Ответов 6
Метки нет (Все метки)

Задача стоит в том, что нужно передать объект класса ofstream конструктору анонимного объекта (допустим, класса Store) и, как следствие, присвоить его члену типа ofstream класса Store. Судя по тому, что я обнаружил, штудируя англоязычные инструкции по классу ofstream, с объектом данного класса никак не удастся воспроизвести копирование, допустима лишь функция swap, которая у меня почему-то отказывается работать, выдавая сообщение "error: 'std::ofstream' has no member named 'swap' ", хотя версия компилятора поддерживает С++11 - GCC 4.7.1. Есть ли какие-нибудь пути решения этой задачи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2014, 18:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Присваивание объекта класса ofstream (C++):

Присваивание объекта базового класса наследуемому - C++
Тут используется библиотека Qt, но вопрос не по ней, тему переносить не стоит! Суть в том, что я из главного класса вынес в отдельный...

Оператор '!=' для объекта std::ofstream и NULL - C++
Здравствуйте, помогите решить эту проблему: До этого сидел на win7 x64 home там тоже была эта ошибка, я решил её путём if (ofile !=...

Переопределение оператора <<, класса ofstream - C++
#ifndef COUT_RUS_H #define COUT_RUS_H #include &lt;iostream&gt; #include &lt;windows.h&gt; namespace rus { class Ccout { ...

ifstream, ofstream и объекты класса - C++
Доброго времени суток, помогите пожалуйста разобраться. Есть некий класс: class Tr { public: Tr(){} ~Tr(){} private:

C++ файлы ifstream/ofstream запись класса - C++
Доброе время суток дамы и господа :) необходимо помочь ибо что-то голова не варит )) класс #pragma once #include &lt;iostream&gt; using...

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

6
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
08.03.2014, 18:08 #2
Aндерсон_256, очевидно, что если объекты данного класса запрещены к копированию, для этого есть причина.
Озвучь свою задачу, может быть тебе не нужно это копирование в принципе?
Если тебе нужно просто воспользоваться открытым файлом в каком-то классе - можно передать ссылку на нужный ofstream.
0
zss
Модератор
Эксперт С++
6478 / 6041 / 1983
Регистрация: 18.12.2011
Сообщений: 15,662
Завершенные тесты: 1
08.03.2014, 18:12 #3
Думаю, вполне достаточно хранить адрес объекта ofstream:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
using namespace std;
class A
{
    ofstream* ff;
public:
    A(ofstream* f0):ff(f0){}
};
int main()
{
    ofstream f;
    A x(&f);
}
0
Aндерсон_256
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 16
08.03.2014, 18:29  [ТС] #4
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
28
29
30
int main () 
{ 
using namespace std; 
vector<string> vostr; 
string temp; 
// Получить строки 
cout « "Enter strings (empty line to quit) :\n"; // запрос на ввод строк 
while (getline (cin, temp) && temp[0] != '\0') 
vostr.push_back(temp); 
cout « "Here is your input. \n"; // вывод введенных строк 
for_each(vostr.begin (), vostr.end(), ShowStr); 
// Сохранить в файле 
ofstream fout("strings.dat", ios_base::out | ios_base::binary); 
for_each (vostr.begin (), vostr.end(), Store(fout)) ; !!!!!!!!!!!!!!!! 
f out .close () ; 
// Восстановить содержимое файла 
vector<string> vistr; 
ifstream fin("strings.dat", ios_base::in | ios_base: :binary) ; 
if (!fin.is_open()) 
{ 
cerr « "Could not open file for input. \n"; 
//не удается открыть файл для ввода 
exit(EXIT_FAILURE); 
} 
GetStrs(fin, vistr); 
cout « "\nHere are the strings read from the file:\n"; 
// строки, прочитанные из файла 
for_each(vistr.begin (), vistr.end(), ShowStr); 
return 0; 
}
Обратите внимание, что файл открывается в бинарном формате и требуется,
чтобы ввод-вывод осуществлялся методами read () и write (). Остается сделать
немного, как перечислено ниже.
• Написать функцию void ShowStr (const string &), которая отображает
объект string с последующим символом перевода строки.
• Написать функтор Store, который записывает строковую информацию в
файл. Конструктор Store должен указывать объект ifstream (вероятнее всего,это опечатка в книге, должно быть ofstream), а
перегруженная функция operator () (const string &) должна указывать строку,
подлежащую записи. Приемлемый подход состоит в записи в файл сначала размера
строки, а затем — ее содержимого. Например, если len содержит размер
строки, можно было бы использовать следующие операторы:
os.write((char *)&len, sizeof(std::size_t)); // сохранить длину
os.write(s.data(), len); // сохранить символы
Член data () возвращает указатель на массив, который содержит символы
строки. Он подобен члену с_str (), за исключением того, что последний
добавляет нулевой символ.
• Написать функцию GetStrs(), которая восстанавливает информацию из
файла. Она может использовать read () для получения размера строки и
затем применять цикл для чтения указанного количества символов из файла,
добавляя их в изначально пустую временную строку. Поскольку данные
объекта string— закрытые, для извлечения данных в строку должен
использоваться метод класса вместо считывания их напрямую в нее.

Добавлено через 10 минут
Цитата Сообщение от zss Посмотреть сообщение
Думаю, вполне достаточно хранить адрес объекта ofstream:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
using namespace std;
class A
{
    ofstream* ff;
public:
    A(ofstream* f0):ff(f0){}
};
int main()
{
    ofstream f;
    A x(&f);
}
Спасибо за совет,но в таком случае придется вносить изменения в main, а это не предусмотрено условиями задачи.
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
08.03.2014, 18:35 #5
Цитата Сообщение от Aндерсон_256 Посмотреть сообщение
Конструктор Store должен указывать объект ifstream (вероятнее всего,это опечатка в книге, должно быть ofstream), а
перегруженная функция operator () (const string &) должна указывать строку,
подлежащую записи.
Ты не правильно понял задание. Имелось в виду вот это:
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
class Store
{
public:
    Store(char const * filename)
        : of(filename, std::ios::binary)
    {}
 
    void operator()(std::string const & str)
    {
        std::size_t len = str.length();
 
        of.write((char *)&len, sizeof(std::size_t)); // сохранить длину
        of.write(str.data(), len); // сохранить символы
    }
 
private:
    std::ofstream of;
};
 
int main()
{
    Store s("test.bin");
 
    s("test string");
}
Добавлено через 4 минуты
Хотя я тоже неправильно понял. Если это функтор, то:
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
class Store
{
public:
    Store(std::ofstream & file)
        : of(file)
    {}
 
    void operator()(std::string const & str)
    {
        std::size_t len = str.length();
 
        of.write((char *)&len, sizeof(std::size_t)); // сохранить длину
        of.write(str.data(), len); // сохранить символы
    }
 
private:
    std::ofstream & of;
};
 
int main()
{
//....
    std::ofstream fout("strings.dat", ios_base::out | ios_base::binary); 
    std::for_each (vostr.begin (), vostr.end(), Store(fout)) ; 
    fout.close() ; 
//....
}
1
Aндерсон_256
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 16
08.03.2014, 18:55  [ТС] #6
DrOffset
Спасибо, о применении ссылки на ofstream мне как-то в голову не пришло
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
08.03.2014, 19:00 #7
Aндерсон_256, я как бы это советовал в первом сообщении
0
08.03.2014, 19:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2014, 19:00
Привет! Вот еще темы с ответами:

Особенности чтения файлов при помощи объектов класса ofstream - C++
Когда в объект ofstream забивается имя файла, который уже существует - он заменяется. Стирается инфа со старого, и создается чистый новый....

Присваивание значений членам класса - C++
Доброго времени суток. Возникла проблема, в классе имеется простая функция set, которая присваивает значения четырем элементам класса,...

Присваивание значений одного класса другому. - C++
Скажите, могу ли я присвоить значения одного объекта класса другому объекту того же класса? class card { //код код код }; int...

Присваивание объектов одного типа между собой и передача объекта в функцию по значению - C++
При первом знакомстве с С++ усиленно не могу понять вот такие моменты : 1. Имеем вот такой код : class use_string { char...


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

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

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