Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 09.10.2021
Сообщений: 72

Неправильно записываются в бинарный файл переменые типа string

08.05.2022, 14:37. Показов 833. Ответов 1

Студворк — интернет-сервис помощи студентам
После чтение из бинарного файла через функцию Load_from_File_to_array значения типа string не выводяться на экран и производять к зависанию програми

P.S. через отладчик ошыбка возникает в перегруженом операторе ostream "<<"

main.cpp↓

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
#include "head.h"
 
int main()
{
    int LENTH = 3;
    string file_name = "tickets.dat";
     Ticket *a = new Ticket[LENTH];
     a[0] = Ticket(6,"KYIV",5,11);
     a[1] = Ticket(6,"KIV",11,11);
     a[2] = Ticket(6,"KYV",1,11);
print_array("\n FROM FILE\n",a,LENTH); // тут все хорошо
 
//Запись объектов в файл 
 
//    ofstream infile1;
//    infile1.open(file_name, ios::binary);
//    if(!infile1)
//    {
//        cout << "Erorr!\n";
//        return 0;
//    }
//    cout << "Writing in file" << endl;
//    for(int i = 0;i<LENTH;i++)
//    {
//        infile1 << a[i];
//    }
//    infile1.close();
 
 
delete[]a;
 
Load_from_File_to_array(file_name,a,LENTH); //вписывание информации из бинарного файла в объекты
print_array("\n FROM FILE\n",a,LENTH); //вот тут возникает ошыбка 
    cout << "end of program\n";
    return 0;
    }


фрагменты из arr.cpp↓


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
63
64
65
66
67
68
69
70
71
int Load_from_File_to_array(string fn,Ticket *&a,int &m)
{
    int pos = 0;
    ifstream f(fn, ios::binary);
    f.seekg(0,ios::end);
    m = (int)f.tellg()/sizeof(Ticket);
    cout << "\nm = " << m << endl;
    //system("pause");
     a = new Ticket[m];//a = new Ticket[m];
    f.seekg(ios::beg);
    for(int i = 0; i<m;i++)
    {
        a[i].read_from_file(fn,pos); // эта функция ниже
    }
    f.close();
    return 1;
}
 
 
int Ticket::read_from_file(string fn,int& pos)
    {
        ifstream fin(fn,ios::binary);
        if (!fin)
        {
            cout << "Can't open file\n";
            return -1;
        }
        cout << "Extracting data...\n\n";
        cout << "\n position = " << pos << endl;
 
          fin.seekg(pos, ios::beg);
          fin.read((char*)this, sizeof(*this));
 
          pos=(int)fin.tellg();
          cout << "\n position = " << pos << endl;
          fin.seekg(0,ios::end);
          fin.close();
 
    return 1;
}
 
void print_array(string mes, Ticket *arr,int n)
{
    cout << mes;
 
     for(int i=0; i<n; i++) {
        cout<<arr[i]; // этот метод перегружен ниже↓
    }
}
 
 
ostream & operator<<(ostream & os, const Ticket &t)
{
cout << "___________________________________" << endl;
cout << "\n place is: ";
os << t.place ;
cout << "\n destination is: ";
os << t.destination ; // вот это string значение и тут програма прирываеться
cout << "\n number of ticket is: ";
os << t.number_of_ticket ;
cout << "\n number of bus is: ";
os << t.number_of_bus ;
cout << "\n status is: ";
os << t.used ;
if(t.count_to_use > 0){cout << "\n multiply, count to use: "; os << t.count_to_use; cout <<"\n";}
else{cout << "one-time" << endl;}
cout << " name is: ";
os << t.User ;
cout << "\n___________________________________" << endl << endl;
return os;
}

head.h ↓

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#pragma once
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#pragma warning(disable : 4996)
 
 
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <fstream>
#include <string>
using namespace std;
 
class Ticket{
private:
 
int number_of_ticket;
static int Count;
 
protected:
int place;
int count_to_use;
int number_of_bus;
bool control;
 
string destination;
string used;
 
 
 
public:
bool sold;
string User;
Ticket ();
Ticket(int _place, string _destination, int _count_to_use, int _number_of_bus);
Ticket(const Ticket&);
~Ticket();
 
void Print(string);
void use_ticket();
void sell_ticket();
void sell_ticket(int);
void anull_ticket();
void input();
int write_in_txt(string);
int read_from_file(string,int&);//,int&
unsigned int rand();
 
//Getters
static int get_count(){return Count;}
int get_place(){return place;}
int get_number(){return number_of_ticket;}
bool get_sold(){return sold;}
bool get_control(){return control;}
string get_destination(){return destination;}
string get_used(){return used;}
string get_User(){return User;}
int get_count_to_use(){return count_to_use;}
int get_number_of_bus(){return number_of_bus;}
 
//Setters
void set_count(int _count){Count = _count;}
void set_place(int _place){place = _place;}
void set_number_of_ticket(int _number_of_ticket){number_of_ticket = _number_of_ticket;}
void set_control(bool _control){control = _control;}
void set_destination(string _destination){destination = _destination;}
void set_User(string _User){User = _User;}
void set_used(string _used){used = _used;}
void set_count_to_use(int _count_to_use){count_to_use = _count_to_use;}
void set_number_of_bus(int _number_of_bus){ number_of_bus = _number_of_bus;}
void set_sold(bool _sold){sold = _sold;}
 
//operators overloading
friend ostream & operator<<(ostream & os, const Ticket &t);
friend istream & operator>>(istream & is, Ticket & t);
friend ofstream& operator<< (ofstream& fout, const Ticket& t);
friend ifstream& operator>> (ifstream& fin, Ticket& t);
bool operator==(const Ticket & t2);
bool operator<(const Ticket & t2);
bool operator>(const Ticket & t2);
};
void print_array(string, Ticket *,int);
void Sorting(Ticket *,int);
int Load_from_File_to_array(string,Ticket *&,int &);
#endif
Миниатюры
Неправильно записываются в бинарный файл переменые типа string  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2022, 14:37
Ответы с готовыми решениями:

Запись/чтение структуры с полем типа String в бинарный файл
Доброго времени суток. Есть слудующая структура struct R { int Number; String Name; String Nick; String email;

Не записываются данные в бинарный файл
Здравствуйте. Есть такая функция: void SaveBin() { if ((fd=fopen(&quot;file.dat&quot;, &quot;wb&quot;))==NULL) return; // открыть файл int...

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

1
Модератор
Эксперт С++
 Аватар для zss
13778 / 10971 / 6491
Регистрация: 18.12.2011
Сообщений: 29,256
08.05.2022, 14:46
Лучший ответ Сообщение было отмечено Zepopo как решение

Решение

Цитата Сообщение от Zepopo Посмотреть сообщение
fin.read((char*)this, sizeof(*this));
Таким способом нельзя читать/писать структуры содержащие контейнеры типа string,
т.к. они хранят данные в динамической памяти.
Соответственно, в файле оказываются только указатели на эти данные.
Подробнее см. Распространенные ошибки
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2022, 14:46
Помогаю со студенческими работами здесь

Цифры в файл записываются неправильно
Здравствуйте!Начал изучать Паскаль, и возник вопрос!При записи информации в файл txt (Например FIO data) FIO нормально записываются, а...

Неправильно записываются данные в файл
Добрый день. Есть код который ищет в файле строчку, находит ее и записывает эту строчку в другой файл. Строчку находит правильно, но когда...

Неправильно записываются байты в файл
Здравствуйте. Пытаюсь создать программу, которая записывает байты в файл. Вот мой код: char bytes...

Неправильно записываются поля в XML-файл
Есть файл compiler_test.xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt; &lt;!--MSG-1 configuration version 1.2--&gt; &lt;Root&gt; ...

Не работает сортировка элементов массива или неправильно записываются элементы в файл
Доброго времени суток! Проблема с сортировкой элементов. Не понимаю в чем дело: #include &lt;stdio.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru