Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
 Аватар для SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532

Не могу прочитать структуру с файла

07.06.2015, 13:31. Показов 870. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Записываю структуру так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T>
    bool SaveStruct(T mys,char *path)
    {
        ofstream fout;
        fout.open(path, ios::binary | ios::out);
        if (!fout.is_open())
        {
            return false;
        }
        fout.write((char*)&mys,sizeof(mys));
        fout.close();
        return true;
    }
Читаю так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template<typename T>
    void ReadStruct(T *mys,char *path)
    {
        
        ifstream f(path);
        if(!f.is_open())
        {
            cout << "НЕ УДАЛОСЬ ЗАГРУЗИТЬ ФАЙЛ " << path << endl;
            return;
        }
        f.read((char*)mys, sizeof(mys));
        f.close();
    }
HASH2 SiteScan;
fil.ReadStruct<HASH2>(&SiteScan,"hash_site.txt");
            SiteScan.Print();
В файл что - то записывается. Я закрываю программу, хочу прочитать эту структуру, но она оказывается пустой. Подскажите в чем проблема. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2015, 13:31
Ответы с готовыми решениями:

Прочитать структуру из файла
Задача: прочитать структуру из файла Вопрос: 1. почему не читаются строки из файла? 2. правильно ли я читаю структуру из файла? ...

Прочитать из файла структуру. Преобразование atoi
Помогите пожалуйста, не могу красиво прочитать из файла. Задали записать информацию в виде структуры в файл, а потом это же прочитать....

Прочитать информацию из файла и рассортировать как структуру, где хранятся данные про каждую книгу
в файле записываю информация про книги: автор, название, год издания, кол-во страниц. нужно с читать её из файла и рассортировать как...

17
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
07.06.2015, 13:39
может в режимах открытия файла на чтения. по умолчанию режим не бинарный вроде.
а при записи у вас бинарный.
еще sizeof(mys) != sizeof(T);
mys у вас указатель а не объект.
еще стрим неплохо бы проверять на то, что в нем не установились флажки failbit или badbit
0
 Аватар для SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
07.06.2015, 13:44  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T>
    void ReadStruct(T *mys,char *path)
    {
        
        ifstream f(path, ios::binary | ios::in);
        if(!f.is_open())
        {
            cout << "НЕ УДАЛОСЬ ЗАГРУЗИТЬ ФАЙЛ " << path << endl;
            return;
        }
        f.read((char*)mys, sizeof(mys));
        f.close();
    }
не помогло

Добавлено через 45 секунд
Может я что - то указателями напутал
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
07.06.2015, 13:59
f.read((char*)mys, sizeof(T));
11 строчку меняли?

Добавлено через 1 минуту
у вас проерки на не ноль нет. т.е. функция не умеет работать с аргументом mys, когда он nullptr.
в таких случаях рекомендуют ссылку передавать.

f.read((char*)&mys, sizeof(mys)); - в случае ссылки там должно заработать.
0
 Аватар для SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
07.06.2015, 16:23  [ТС]
Все равно не читает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T>
    void ReadStruct(T *mys,char *path)
    {
        
        ifstream f(path, ios::binary | ios::in);
        if(!f.is_open())
        {
            cout << "НЕ УДАЛОСЬ ЗАГРУЗИТЬ ФАЙЛ " << path << endl;
            return;
        }
        f.read((char*)&mys, sizeof(mys));
        f.close();
    }
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
07.06.2015, 16:27
Цитата Сообщение от SanychBY Посмотреть сообщение
Все равно не читает
Выложи код, который можно проверить.

Добавлено через 1 минуту
Цитата Сообщение от SanychBY Посмотреть сообщение
f.read((char*)&mys, sizeof(mys));
Ты посты читаешь? Насчёт этого уже написали, как должно быть:
Цитата Сообщение от Perfilov Посмотреть сообщение
f.read((char*)mys, sizeof(T));
0
 Аватар для SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
07.06.2015, 16:31  [ТС]
У меня просто все распихано....
file.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
#pragma once
#include <fstream>
#include <iostream>
using namespace std;
 
 
struct MYFILE
{
    template<typename K>
    bool EnterFile(char *path, K *str)
    {
        ofstream fout;
        fout.open(path, ios::app);
        if (!fout.is_open())
        {
            return false;
        }
        fout << str << endl;
        fout.close();
        return true;
    }
    template<typename T>
    bool SaveStruct(T mys,char *path)
    {
        ofstream fout;
        fout.open(path, ios::binary | ios::out);
        if (!fout.is_open())
        {
            return false;
        }
        fout.write((char*)&mys,sizeof(mys));
        fout.close();
        return true;
    }
    template<typename T>
    void ReadStruct(T *mys,char *path)
    {
        
        ifstream f(path, ios::binary | ios::in);
        if(!f.is_open())
        {
            cout << "НЕ УДАЛОСЬ ЗАГРУЗИТЬ ФАЙЛ " << path << endl;
            return;
        }
        f.read((char*)&mys, sizeof(mys));
        f.close();
    }
    bool TestFile(char* path)
    {
        ifstream f;
        f.open(path);
        if (!f.is_open())
        {
            return false;
        }
        else
        {
            return true;
        }
    }
};
hash.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
struct HASH2
{
private:
    short int T_SIZE = 1000;
    struct node
    {
        node *next;
        node *prev;
        long int key;
        void* data;
        node()
        {
            next = NULL;
            key = NULL;
        }
    };
    
 
    node *A = new node[this->T_SIZE];
    int HashFun(char *t)//Универсальное хэширование
    {
        int a = 31415, b = 27183, h;
        for (h = 0; *t != 0;t++, a = a*b % (this->T_SIZE - 1))
        {
            h = (a*h + *t) % this->T_SIZE;
        }
        return (h < 0) ? (h + this->T_SIZE) : h;
    }
public:
    void Insert(char* page)
    {
        int index = this->HashFun(page);
        if (A[index].key != NULL)
        {
            //cout << A[index].key << endl;
            node *c = &this->A[index];
            node *c2 = c;
            //cout << slovo << endl;
            while (c)
            {
                c2 = c;
                c = c->next;
            }
            node *t = new node;
            t->data = page;
            t->key = index;
            t->prev = c2;
            c2->next = t;
            cout << A[index].key << endl;
        }
        else
        {
            node *t = new node;
            t->data = page;
            t->key = index;
            t->prev = NULL;
            this->A[index] = *t;
 
        }
    }
    void Print()
    {
        for (int i = 0; i < this->T_SIZE; i++)
        {
            if (this->A[i].key)
            {
                node *t = &A[i];
                while (t)
                {
                    cout << "key: " << t->key << endl;
                    cout << (char*)t->data << endl;
                    t = t->next;
                }
            }
        }
    }
    bool Search(char* slovo)
    {
        int index = HashFun(slovo);
        
 
        if (this->A[index].key != NULL)
        {
            node *t = &this->A[index];
            while (t)
            {
                if (stricmp(slovo, (char*)t->data) == 0)
                {
                    return true;
                }
                t = t->next;
            }
        }
        else
        {
            return false;
        }
    }
};
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
MYFILE fil;
HASH2 SiteScan;
struct START
{
    bool Pusk()
    {
        cout << "Начинаю пуск паука" << endl;
        if (fil.TestFile("hash_site.txt"))
        {
            fil.ReadStruct<HASH2>(&SiteScan,"hash_site.txt");
            SiteScan.Print();
        }
        char *sdf = new char[1000];
        sprintf(sdf,"%d",COL_FILE);
        strcat(sdf,".site");
        
        while (fil.TestFile(sdf))
        {
            COL_FILE++;
            sprintf(sdf, "%d", COL_FILE);//число в строку
            strcat(sdf, ".site");
        }
        delete []sdf;
        return true;
        cout << "Пуск завершен" << endl;
    }
    ~START()
    {
        remove("hash_site.txt");
        fil.SaveStruct<HASH2>(SiteScan, "hash_site.txt");
    }
};
Добавлено через 3 минуты
Цитата Сообщение от lss Посмотреть сообщение
Ты посты читаешь? Насчёт этого уже написали, как должно быть:
Сообщение от Perfilov
f.read((char*)mys, sizeof(T));
Тогда "Необработанное исключение по адресу"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Print()
    {
        for (int i = 0; i < this->T_SIZE; i++)
        {
            if (this->A[i].key)
            {
                node *t = &A[i];
                while (t)
                {
                    cout << "key: " << t->key << endl;
                    cout << (char*)t->data << endl;
                    t = t->next;
                }
            }
        }
    }
О строке if (this->A[i].key)
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
07.06.2015, 16:32
Цитата Сообщение от SanychBY Посмотреть сообщение
Тогда "Необработанное исключение по адресу"
Тогда - это уже другая ошилка.
Считаешь, что этот код можно проверить? А main() где?
0
 Аватар для SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
07.06.2015, 16:34  [ТС]
Видать, не просто так скопировать можно.

Добавлено через 56 секунд
C++
1
2
3
4
START Go;
void main(void) {
Go.Pusk();
}
0
 Аватар для SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
07.06.2015, 16:36  [ТС]
Вот исходники проекта
Вложения
Тип файла: zip myprogect.zip (4.5 Кб, 3 просмотров)
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
07.06.2015, 18:07
Разберись с тем, что в файл записываешь. Указатель на массив неинициализированных структур? И, при следующем запуске, хочешь найти какие-то данные по этому указателю?
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
07.06.2015, 18:13
были у меня подозрения, что сериализуется не POD тип. Похоже так и есть, попытка сериализовать объект типа HASH2. внутри него данные: размер и указатель на нод. так вот сериализуется не то, на что указыает указатель, а значение указателя. скажем 0xf0a0b0c0d0; после запуска програмы и корректной десериализации, его значение должно быть таким же: 0xf0a0b0c0d0, только вот обращатся по этому указателю в надежде что будет все хороше - нельзя. по этому адресу может находится все, что угодно. Для не POD объектов нужно писать свой метод сериализации, ваш шаблонный вариант не проканает.
0
 Аватар для SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
07.06.2015, 18:40  [ТС]
Так а как мне тогда сохранить эту структуру со всем ее содержимым?
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
07.06.2015, 19:04
Цитата Сообщение от SanychBY Посмотреть сообщение
Так а как мне тогда сохранить эту структуру со всем ее содержимым?
Записывай данные из структруры, а не память под ней.
0
 Аватар для SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
07.06.2015, 19:07  [ТС]
Не знаю как. Тут хэширование цепочкой. Массив содержит указатели на списки. Как то надо сохранить сам массив, а потом каждый список....
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
07.06.2015, 19:27
ну вот и сохраняйте. вот пример сериализации\десериализации списка структурок.
подход должен быть понятен, вам надо будет под свои структурки это дело подогнать:

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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <list>
#include <iostream>
#include <sstream>
#include <vector>
 
struct NodeData
{
  int key;
  std::string data;
 
  NodeData(int k = 0, const std::string& d = std::string())
    : key(k)
    , data(d)
  {
  }
};
 
typedef std::list<NodeData> Nodes;
 
void PrintNodes(const std::string& title, const Nodes& nodes)
{
  std::cout << title << std::endl;
  for (const auto& n : nodes)
  {
    std::cout << "  " << n.key  << " -> " << n.data << std::endl;
  }
}
 
//////////////////////////////////////////////
 
template <typename T>
void Serialize(std::ostream& out, const T& obj)
{
  out.write((const char*)&obj, sizeof(obj));
}
 
 
template <typename T>
void Deserialize(std::istream& in, T& obj)
{
  in.read((char*)&obj, sizeof(obj));
}
 
void Serialize(std::ostream& out, const std::string& str)
{
  const std::size_t size = str.size();
  Serialize(out, size);
  if (size)
  {
    out.write(str.c_str(), size);
  }
}
 
void Deserialize(std::istream& in, std::string& str)
{
  std::size_t size = 0;
  Deserialize(in, size);
  std::vector<char> buf(size, 0);
  if (size)
  {
    in.read(&buf[0], size);
  }
  str.assign(buf.begin(), buf.end());
}
 
void Serialize(std::ostream& out, const NodeData& node)
{
  Serialize(out, node.key);
  Serialize(out, node.data);
}
 
void Deserialize(std::istream& in, NodeData& node)
{
  Deserialize(in, node.key);
  Deserialize(in, node.data);
}
 
void Serialize(std::ostream& out, const Nodes& nodes)
{
  const std::size_t size = nodes.size();
  Serialize(out, size);
  for (const auto& n : nodes)
  {
    Serialize(out, n);
  }
};
 
void Deserialize(std::istream& in, Nodes& nodes)
{
  std::size_t size = 0;
  Deserialize(in, size);
  Nodes result;
  for (std::size_t i = 0; i < size; ++i)
  {
    NodeData nd;
    Deserialize(in, nd);
    result.push_back(nd);
  }
  result.swap(nodes);
};
 
 
//////////////////////////////////////////////
 
void main()
{
  std::ostringstream oss;
 
  Nodes nodes1;
  nodes1.push_back(NodeData(1, "this is 1"));
  nodes1.push_back(NodeData(2, "this is 2"));
  nodes1.push_back(NodeData(3, "this is 3"));
  PrintNodes("nodes1", nodes1);
  Serialize(oss, nodes1);
 
  std::string nodesData = oss.str();
  std::istringstream iss(nodesData);
  Nodes nodes2;
  Deserialize(iss, nodes2);
  PrintNodes("nodes2", nodes2);
}
0
 Аватар для SanychBY
39 / 46 / 3
Регистрация: 04.06.2013
Сообщений: 1,532
07.06.2015, 19:34  [ТС]
Perfilov, зачем вам столько перегрузок?
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
07.06.2015, 19:40
каждый тип данных сериализуется по своему. те, которые POD типы - их шаблонно можно сериализовать.
под все остальное нужен свой метод сериализации и десериализации. Не нравятся одинаковые имена у функций - ну пишите разные если хочется. суть не в этом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2015, 19:40
Помогаю со студенческими работами здесь

Не могу прочитать из файла в класс
Доброго времени суток! Есть проблемка. У меня имеется класс Студент, в котором есть функция записи в файл(здесь все получилось отлично) и...

Не могу прочитать с бинарного файла компонент
Здравствуйте! Помогите, пожалуйста, совсем начинающему энтузиасту. Программа динамически создает определенный набор компонентов с...

Укажите на ошибку (не могу прочитать из файла в цикле)
Привет, есть цикл который динамически создает две кнопки на форме: #define BTN_MAX_LOADSTRING 10 ... for...

При открытии файла Excel выдает сообщение 'Не могу прочитать файл'.
Добрый день! При открытии файла Excel выдает сообщение 'Не могу прочитать файл'. Что-нибудь можно сделать? Спасибо всем, кто поможет.

Прочитать файл в обратном порядке т.е. встать в конец файла и прочитать до начальной позиции
подскажите пожалуйста как можно прочитать файл в обратном порядке т.е. стать в конец файла и прочитать до начальной позиции?


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru