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

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

Восстановить пароль Регистрация
 
Aндерсон_256
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 16
08.03.2014, 18:01     Присваивание объекта класса ofstream #1
Задача стоит в том, что нужно передать объект класса ofstream конструктору анонимного объекта (допустим, класса Store) и, как следствие, присвоить его члену типа ofstream класса Store. Судя по тому, что я обнаружил, штудируя англоязычные инструкции по классу ofstream, с объектом данного класса никак не удастся воспроизвести копирование, допустима лишь функция swap, которая у меня почему-то отказывается работать, выдавая сообщение "error: 'std::ofstream' has no member named 'swap' ", хотя версия компилятора поддерживает С++11 - GCC 4.7.1. Есть ли какие-нибудь пути решения этой задачи?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
08.03.2014, 18:08     Присваивание объекта класса ofstream #2
Aндерсон_256, очевидно, что если объекты данного класса запрещены к копированию, для этого есть причина.
Озвучь свою задачу, может быть тебе не нужно это копирование в принципе?
Если тебе нужно просто воспользоваться открытым файлом в каком-то классе - можно передать ссылку на нужный ofstream.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,196
Завершенные тесты: 1
08.03.2014, 18:12     Присваивание объекта класса ofstream #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);
}
Aндерсон_256
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 16
08.03.2014, 18:29  [ТС]     Присваивание объекта класса ofstream #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, а это не предусмотрено условиями задачи.
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
08.03.2014, 18:35     Присваивание объекта класса ofstream #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() ; 
//....
}
Aндерсон_256
0 / 0 / 0
Регистрация: 02.11.2013
Сообщений: 16
08.03.2014, 18:55  [ТС]     Присваивание объекта класса ofstream #6
DrOffset
Спасибо, о применении ссылки на ofstream мне как-то в голову не пришло
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2014, 19:00     Присваивание объекта класса ofstream
Еще ссылки по теме:

Присваивание объекта базового класса наследуемому C++
переопределение оператора <<, класса ofstream C++
C++ Присваивание объекта без переопределенной операции =. Каковы последствия?

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

Или воспользуйтесь поиском по форуму:
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
08.03.2014, 19:00     Присваивание объекта класса ofstream #7
Aндерсон_256, я как бы это советовал в первом сообщении
Yandex
Объявления
08.03.2014, 19:00     Присваивание объекта класса ofstream
Ответ Создать тему
Опции темы

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