Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 182
1

Как класс string записать в бинарный файл через вектор?

02.03.2016, 14:57. Просмотров 1069. Ответов 22
Метки нет (Все метки)

вопрос такой у меня есть класс. я создаю вектор по этому классу
C++
1
vector<Employee> work;
вектор отлично заполняется и вся программа хорошо работает.
но когда я хочу применить

C++
1
2
3
4
5
6
7
8
const string BINAR_FILE = "binarfile";
    ofstream fout(BINAR_FILE, ios::binary);
for (int i = 0; i < Getcountwork(); ++i)
{
fout.write((char*)&work[i] sizeof work[i]; // дает ошибку sizeof слишком мало аргументов вызове функции.
 
}
fout.close();
полный код программы не бросил сюда из за его огромности.
проблема именно в том чтобы есть класс с огромным количеством данных, который помещен вектор и его нужно записать в бинарный файл
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
31
32
class Employee
{
public:
    Employee();
    Employee::Employee(string firstName, string lastName, string address, USHORT sallarry, string positionPersonal, bool SexOfPerson);
    ~Employee(){}
 
    void SetFirstName(const string firstName);
    inline string GetFirstName()const { return ItsFirstName; }
 
    void SetLastName(const string lastName);
    inline string GetLastName()const { return ItsLastName; }
 
    void SetAddress(const string address);
    inline string GetAddress()const { return ItsAddress; }
 
    void SetSalary(const USHORT salary);
    inline USHORT GetSalary()const { return ItsSalary; }
 
    void SetPositionPersonal(const int positionPersonal);
    inline string GetPositionPersonal()const { return ItsPosition; }
    
    void SetSexOfPerson(const bool Sex);
    string GetSexOfPerson()const;
    
private:
    string ItsFirstName, ItsLastName, ItsAddress, ItsPosition;
    USHORT ItsSalary;
    bool ItsSexOfPerson;
    
    
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.03.2016, 14:57
Ответы с готовыми решениями:

Как число, введенное в string, записать в вектор int?
Пользователь вводит число в переменную типа string, нужно создать вектор типа int с этим числом. Ну...

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод)
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student {...

Как правильно записать символьный массив в бинарный файл?
Хочу записать в бинарный файл две строки. 1 - &quot;даня&quot;, 2 - &quot;маша&quot;. открываю так: ofstream...

Как записать в бинарный файл структуры записи из текстового файла?
Здравствуйте! Прошу помочь с чтением из текстового файла а затем запись всего что записано в...

22
842 / 773 / 258
Регистрация: 27.07.2012
Сообщений: 2,180
02.03.2016, 15:00 2
Цитата Сообщение от mercurygermes Посмотреть сообщение
C++
1
fout.write((char*)&work[i] sizeof work[i];
Что это и как вообще?!

C++
1
fout.write((char*)&work[i], sizeof(work[i]));
1
662 / 281 / 96
Регистрация: 04.07.2014
Сообщений: 793
02.03.2016, 15:07 3
fout.write((char*)&work[i],.... - И где ты видел такой метод сохранения объектов? Ты хоть понял, что ты сохраняешь? Изучаем тему Сериализация
1
2683 / 1855 / 552
Регистрация: 05.06.2014
Сообщений: 5,344
02.03.2016, 15:12 4
1) fout.write((char*)&work[i] sizeof work[i]; fout.write((char*)&work[i] sizeof(work[i]));
2) Через write можно писать только числа и сишные массивы. Все остальное для него слишком сложно.
3) Если на такие блага цивилизации как многострочный текст не претендуете, то самое простое:
C++
1
2
3
4
5
6
7
8
std::string str="1234";
std::ofstream out("test");
out<<str<<endl;
out.close();
 
std::ifstream in("test");
getline(in,str);
cout<<"в файле было:"<<str<<endl;
И да, stream тоже умеет write/read. Можете делать << и write вперемешку, главное - не пытайтесь читать через read то что написано через <<.
1
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 182
02.03.2016, 15:23  [ТС] 5
)) этот код я видел у джеса либерти. 21 день с++.
сейчас изучаю два гуся, но он слишком сложный, думаю перейти на прата или липмана.
в файлы сохранять умею, но мне нужно в бинароном виде.
0
1321 / 483 / 67
Регистрация: 21.07.2015
Сообщений: 1,244
02.03.2016, 15:24 6
Цитата Сообщение от mercurygermes Посмотреть сообщение
но мне нужно в бинароном виде.
Что конкретно нужно сохранить в бинарном виде?
1
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 182
02.03.2016, 15:33  [ТС] 7
у меня есть обекты класса Empoyee.
к примеру есть работники
sasha grey зарплата специальность и т.д.
они записаны в векторе как vecror<Employee> work;
я динамически заполняю персонал gina gerson, sasha grey и т.д
и каждого работника создается свой файл с данными..
но проблема в том когда я закрываю программу и заного запускаю программу, я не могу динамически отсортировать всех работников.
я хочу работников записать в бинарный файл с их данными, а когда заного зупущу программу, то автоматически для каждого работника будет создан свой объект и когда я буду добавлять нового работника, я смогу правильно их сортировать по зарплате, возрасту или другим характеристикам. так как кажный персонал, будет иметь свой объект в программе.
0
2683 / 1855 / 552
Регистрация: 05.06.2014
Сообщений: 5,344
02.03.2016, 15:36 8
Цитата Сообщение от mercurygermes Посмотреть сообщение
в файлы сохранять умею, но мне нужно в бинароном виде.
<< работает и когда поток открыт в бинарном режиме. Только отваливается автоматическое преобразование некоторых спецсимволов типа '\n' (для Винды меняется на \r\n). Но это критично лишь в том случае, если вы собираетесь открывать ваш файл в Блокноте.
1
1321 / 483 / 67
Регистрация: 21.07.2015
Сообщений: 1,244
02.03.2016, 15:38 9
mercurygermes, еще раз: без воды сформулируй объект(ы) какого типа ты хочешь сохранить в файл в бинарном виде.
1
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 182
02.03.2016, 15:44  [ТС] 10
&Enqueue in KMP а для такого файла играет роль?

Добавлено через 3 минуты
наверху я написал, что обекты класса Employee;
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
31
32
class Employee
{
public:
    Employee();
    Employee::Employee(string firstName, string lastName, string address, USHORT sallarry, string positionPersonal, bool SexOfPerson);
    ~Employee(){}
 
    void SetFirstName(const string firstName);
    inline string GetFirstName()const { return ItsFirstName; }
 
    void SetLastName(const string lastName);
    inline string GetLastName()const { return ItsLastName; }
 
    void SetAddress(const string address);
    inline string GetAddress()const { return ItsAddress; }
 
    void SetSalary(const USHORT salary);
    inline USHORT GetSalary()const { return ItsSalary; }
 
    void SetPositionPersonal(const int positionPersonal);
    inline string GetPositionPersonal()const { return ItsPosition; }
    
    void SetSexOfPerson(const bool Sex);
    string GetSexOfPerson()const;
    
private:
    string ItsFirstName, ItsLastName, ItsAddress, ItsPosition;
    USHORT ItsSalary;
    bool ItsSexOfPerson;
    
    
};
вот этого объекта в векторе vector<Employee> work;
примерно так
fout.write((char*)&work[i], sizeof(work[i]));
0
1321 / 483 / 67
Регистрация: 21.07.2015
Сообщений: 1,244
02.03.2016, 15:46 11
Цитата Сообщение от mercurygermes Посмотреть сообщение
&Enqueue in KMP
Это на каком языке? Приведи описание типа.
1
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 182
02.03.2016, 15:47  [ТС] 12
пишу на c++
вот так сохраняю файлы. но это сейчас не бинарный файл, а я хочу создать отдельно функцию для бинарного файла
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
void OperationFile::SaveFile()
{
    for (int i = 0; i < work.size(); ++i)
    {
        string fileName = work[i].GetFirstName();
        
        ofstream fout(fileName,ios::app);
        if (!fout)
        {
            cout << "Unable to open " << fileName << " for appending. \n";
 
        }
        else
        {
            fout << "first name: " << work[i].GetFirstName() << endl;
            fout << "last name: " << work[i].GetLastName() << endl;
            fout << "address: " << work[i].GetAddress() << endl;
            fout << "salary: " << work[i].GetSalary() << endl;
            fout << "the position of staff: " << work[i].GetPositionPersonal() << endl;
            fout << "Sex of a person: " << work[i].GetSexOfPerson() << endl;
        }
        fout.close();
        string AllPersonal = "AllPersonal";
        ofstream fouts(AllPersonal, ios::app);
        fouts << "first name: " << work[i].GetFirstName() << endl;
        fouts.close();
        
    }
 
}
0
1321 / 483 / 67
Регистрация: 21.07.2015
Сообщений: 1,244
02.03.2016, 15:47 13
Цитата Сообщение от mercurygermes Посмотреть сообщение
fout.write((char*)&work[i], sizeof(work[i]));
Нельзя так. std::string не предназначен для этого.
1
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 182
02.03.2016, 15:53  [ТС] 14
а как тогда записать данные, или мне тогда перевести весь string в массив char?
0
1321 / 483 / 67
Регистрация: 21.07.2015
Сообщений: 1,244
02.03.2016, 15:59 15
Если есть непреодолимое желание сохранить std::string с помощью write (без претензий на правильность):
запись:
C++
1
2
3
std::string::size_type sz = str.length();
fout.write((char*)&sz, sizeof(sz));
fout.write(&str[0], sz);
чтение
C++
1
2
3
fin.read((char*)&sz, sizeof(sz));
str.resize(sz);
fin.read(&str[0], sz);
1
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 182
02.03.2016, 16:04  [ТС] 16
а как можно еще записать данные в бинарный файл, чтобы потом при извлечении я мог их снова присвоить обектам, у которых разные типы данных, включая тип данных string;
0
1321 / 483 / 67
Регистрация: 21.07.2015
Сообщений: 1,244
02.03.2016, 16:06 17
Цитата Сообщение от mercurygermes Посмотреть сообщение
а как можно еще записать данные в бинарный файл
А в чем проблема?
0
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 182
02.03.2016, 16:18  [ТС] 18
есть класс
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
31
32
class Employee
{
public:
    Employee();
    Employee::Employee(string firstName, string lastName, string address, USHORT sallarry, string positionPersonal, bool SexOfPerson);
    ~Employee(){}
 
    void SetFirstName(const string firstName);
    inline string GetFirstName()const { return ItsFirstName; }
 
    void SetLastName(const string lastName);
    inline string GetLastName()const { return ItsLastName; }
 
    void SetAddress(const string address);
    inline string GetAddress()const { return ItsAddress; }
 
    void SetSalary(const USHORT salary);
    inline USHORT GetSalary()const { return ItsSalary; }
 
    void SetPositionPersonal(const int positionPersonal);
    inline string GetPositionPersonal()const { return ItsPosition; }
    
    void SetSexOfPerson(const bool Sex);
    string GetSexOfPerson()const;
    
private:
    string ItsFirstName, ItsLastName, ItsAddress, ItsPosition;
    USHORT ItsSalary;
    bool ItsSexOfPerson;
    
    
};
я создаю и инициализирую каждый объект в этой функции.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
void OperationFile::SetEmployeeList()
{
     DataCheking cheking;
    USHORT numberPersonal, salary;
    Employee  pEmloyee;
    string firstName, lastName, address;
    char address2[31];
    bool OnOf = true, SexOfPerson = true;
    while (OnOf)
    {
        system("cls");
        cout << "(если номер равен нулю выход) Выберите должность персонала.\n нажмите на соответсвующий номер\n: ";
        cout << "1-Director, 2-Deputy Director, 3-HR Manager, 4-Actor: ";
        cheking.input(numberPersonal);
        if (numberPersonal == 0)
            break;
        
        if (numberPersonal >= maximum)
        {
            cout << "такой должности не существует!\n";
            cout << "пожалуйста повторите выбор! \n";
            system("pause");
            continue;
        }
        
        /////////////////////////////**********************************
        
        cheking.InputAlphaString(firstName,"Введите имя: ");
        cheking.InputAlphaString(lastName, "Введите фамилию: ");
 
        cout << "Введите адресс: ";
        cin.ignore(30, '\n');
        cin.getline(address2, 30);
        address = address2;
 
        cout << endl;
        cout << "Введите зарплату работника: (не больше 50000): ";
        while (!(cin >> salary) || (cin.peek() != '\n') || (salary>50000))
        {
            cin.clear();
            while (cin.get() != '\n');
            system("cls");
            cout << "Неправильный ввод. Повторите.\n";
            cout << "Вы вели символы или превысли зарплату выше 50000!\n Введите зарплату работника: (не больше 50000): ";
        }
        cout << "1 - мужской, 0 - женский\n";
        cout << "выберите пол: ";
        cheking.input(SexOfPerson);
        
        pEmloyee.SetFirstName(firstName);
        pEmloyee.SetLastName(lastName);
        pEmloyee.SetAddress(address);
        pEmloyee.SetSalary(salary);
        pEmloyee.SetPositionPersonal(numberPersonal);
        pEmloyee.SetSexOfPerson(SexOfPerson);
        work.push_back(pEmloyee);
        
        
    }
    
    
}
я хочу чтобы файл каждого объекта был сохранен в бинарный файл.
что это даст мне? ответ: когда я запишу к примеру 3 человек и закрою программу, то после открытия снова это программы и записи новых людей в эту программу, я смогу, предыдущих людей записать в объект и теперь сравнить данные новых людей с ранее записаными людьми. если я запищу в текстовый файл виде строки, то я не смогу извлечь данные и сравнить их с новыми данными. я смогу извлекать только данные, но не сравнивать их
0
1321 / 483 / 67
Регистрация: 21.07.2015
Сообщений: 1,244
02.03.2016, 16:23 19
mercurygermes, ты не понял вопроса: в чем проблема последовательно записать все члены класса?
1
1 / 1 / 0
Регистрация: 26.09.2015
Сообщений: 182
02.03.2016, 16:28  [ТС] 20
последовательно это как ты имеешь ввиду? обясни
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2016, 16:28

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как записать вектор в файл?
Как записать вектора в файл? Вектор содержит тип long long. Записать в одну строчку в виде одного...

Как записать string в файл?
Добрый день, есть код программы, необходимо записать строку в текстовый файл. У меня получаются...

Запись string в бинарный файл
Здравствуйте еще раз! ^_^ Хочу понять, как правильно записывать бинарный файл и считывать...

Запись string в бинарный файл
Задача такая. Записать в бинарный файл строку string, а потом убедится, что все было записано...


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

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

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