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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
TitoAlehandro
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 6
#1

Структура самоадресуемая - C++

21.04.2009, 12:30. Просмотров 1109. Ответов 6
Метки нет (Все метки)

Приветствую всех!
Есть задача:чтение двоичного файла с зараннее известной структурой.
Особенность:структура самоадресуемая(динамическое выделение памяти).
Кто-нибудь сталкивался с такой проблемой?Инет по этому поводу молчит,Архангельский только выдает примеры на создание двоичного файла,а по поводу чтения неособо.
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
//самоадресуемая структура
struct TEtl
{
AnsiString Meropr;
AnsiString Na4_Meropr;
AnsiString End_Meropr;
AnsiString Parametr;
AnsiString Na4_Parametr;
AnsiString End_Parametr;
TEtl * pr;
};
//--------------------------------------
 
//заполнение струкутуры
 
Pnew = new TEtl;
Pnew->Meropr=Etalon->ETL_NameMeropr->Text;
Pnew->Na4_Meropr=Etalon->Etl_MIN->Time.TimeString();
Pnew->End_Meropr=Etalon->Etl_MAX->Time.TimeString();
Pnew->Parametr=Edm_parametr->Text;
Pnew->Na4_Parametr=Edm_MIN->Text;
Pnew->End_Parametr=Edm_MAX->Text;
Pnew->pr= NULL;
if(P0 == NULL) P0 = Pnew;
else Pold->pr = Pnew;
Pold = Pnew;
//-------------------------------------------------------------
 
 
 
//сохранение струкутуры в файл
    FILE * F;
Etl_SaveEtl_dialog->Execute();
if ((F = fopen(Etl_SaveEtl_dialog->FileName.c_str(),"wb"))==NULL)
{
ShowMessage("Oaee ia oaaaony nio?aieou");
return;
}
Pnew = P0;
while(Pnew != NULL)
{
fwrite (&Pnew,sizeof(TEtl),1,F);
Pnew = Pnew->pr;
}
//-------------------------------------------------------------
 
 
//чтение струкутуры из файла
 
    TEtl *E0=NULL,*Eold,*Enew;
ifstream ifile(Open_ETL->Dialog->FileName.c_str(),ios::binary);
Enew=new TEtl;
 
while (!ifile.read((char*)&Enew,sizeof(TEtl)).eof())
{
 
ifile.read((char*)&Enew,sizeof(TEtl));
 
if(E0 == NULL) E0 = Enew;
else Eold->pr = Enew;
Eold = Enew;
}
 
//-------------------------------------------------------------
Чтения как такового не происходит.Максимум - это абракадабра при первом обращении функции read, а затем выдает только одни нули.Если кто знает особенности чтения самоадресуемой структуры,help please...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2009, 12:30     Структура самоадресуемая
Посмотрите здесь:

структура - C++
#include<iostream.h> #include<conio.h> #include<string.h> #define n3 struct avtoprice { char marka ; int year,price; }; ...

структура - C++
почему компилятор не одобряет такую запись cout<<"Координаты суммарной точки равны - x "<<p3.x=p2.x+p1.x; cout<< "y"...

Структура - C++
Я не давно начал изучать C++, сам пробовал, мало что получилось. Условие задачи: Дана следующая информация о книгах библиотеки: автор,...

структура - C++
описать структуру, соедржащую: фамилию знак зодиака день рождения написать программу: 1.данные в массиве программы, упорядоченные...

Структура - C++
Описать структуру с именем TRAIN, содержащую следующие поля: Название пункта; номер поезда; Время отправления; Программа...

структура c++ - C++
Помогите пожалуйста, в условии ошибка , но я не понимаю какая-именно #include<iostream> #include<windows.h> #include<time.h> ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
21.04.2009, 12:50     Структура самоадресуемая #2
Ну разумеется. У тебя не только чтение не происходит, но и запись тоже Точнее, записываешь ты в структуру - не данные, а абракадабру.

Нужно записывать в файл не &Pnew, sizeof(TEtl), а - поэлементно члены структуры, например, сначала длину строки Meropr, затем собственно содержимое Meropr, и так для каждого члена, за исключением члена pr - вот он в файле уже не нужен будет. А читать - точно так же, почленно.
TitoAlehandro
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 6
21.04.2009, 13:05  [ТС]     Структура самоадресуемая #3
C++
1
2
3
4
5
6
7
8
9
10
11
while(Pnew != NULL)
        {
                fwrite (&Pnew->Meropr,sizeof(AnsiString),1,F);
                fwrite (&Pnew->Na4_Meropr,sizeof(AnsiString),1,F);
                fwrite (&Pnew->End_Meropr,sizeof(AnsiString),1,F);
                fwrite (&Pnew->Parametr,sizeof(AnsiString),1,F);
                fwrite (&Pnew->Na4_Parametr,sizeof(AnsiString),1,F);
                fwrite (&Pnew->End_Parametr,sizeof(AnsiString),1,F);
                Pnew = Pnew->pr;
 
        }
Что-то не понял по поводу отдельного ввода длины строки и собственно её содержания.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
21.04.2009, 13:44     Структура самоадресуемая #4
Нет, все равно неверно. Лучше, но неверно.
Писать надо где-то так:
C++
1
2
3
int len = Pnew->Meropr.length();  // или какая функция вернет длину?
fwrite (&len, sizeof(len), 1, F);   // записать длину 
fwrite (Pnew->Meropr.c_str(), len, 1, F);  // записать содержимое
Насчет отдельно длины строки и ее содержания: при записи ты мог бы не записывать в файл длину строки. Но - как тогда при чтении ты узнаешь, сколько читать содержимого? (т.е. где заканчивается одна строка и начинается другая)? Длина нужна - именно при чтении.
TitoAlehandro
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 6
21.04.2009, 14:20  [ТС]     Структура самоадресуемая #5
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
while(Pnew != NULL)
        {
                int len = Pnew->Meropr.Length();
                fwrite (&len, sizeof(len), 1, F);
                fwrite (Pnew->Meropr.c_str(), len, 1, F);
 
                len = Pnew->Na4_Meropr.Length();
                fwrite (&len, sizeof(len), 1, F);
                fwrite (Pnew->Na4_Meropr.c_str(), len, 1, F);
 
                len = Pnew->End_Meropr.Length();
                fwrite (&len, sizeof(len), 1, F);
                fwrite (Pnew->End_Meropr.c_str(), len, 1, F);
 
                len = Pnew->Parametr.Length();
                fwrite (&len, sizeof(len), 1, F);
                fwrite (Pnew->Parametr.c_str(), len, 1, F);
 
                len = Pnew->Na4_Parametr.Length();
                fwrite (&len, sizeof(len), 1, F);
                fwrite (Pnew->Na4_Parametr.c_str(), len, 1, F);
 
                len = Pnew->End_Parametr.Length();
                fwrite (&len, sizeof(len), 1, F);
                fwrite (Pnew->End_Parametr.c_str(), len, 1, F);
 
                Pnew = Pnew->pr;
 
        }
 
Большое спасибо.Записывал только адреса...
 
 
 
чтение стало быть должно выглядеть следующим образом :
 
 
if ((F = fopen(Open_ETL->Dialog->FileName.c_str(),"ab+"))==NULL)
       {
        ShowMessage("Г”Г*éë Г*ГҐ ГіГ¤Г*ëîñü îòêðûòü");
        return;
       }
 
 
       TEtl *E0=NULL,*Eold,*Enew;
 
       ifstream ifile(Open_ETL->Dialog->FileName.c_str(),ios::binary);
 
       Enew=new TEtl;
       while (!ifile.read((char*)&Enew,sizeof(TEtl)).eof())
        {
 
                
                int len=0;
                fread (&len,sizeof(int),1,F);
                fread (&Enew->Meropr,len,1,F);
 
                fread (&len,sizeof(int),1,F);
                fread (&Enew->Na4_Meropr,len,1,F);
 
                fread (&len,sizeof(int),1,F);
                fread (&Enew->End_Meropr,len,1,F);
 
                fread (&len,sizeof(int),1,F);
                fread (&Enew->Parametr,len,1,F);
 
                fread (&len,sizeof(int),1,F);
                fread (&Enew->Na4_Parametr,len,1,F);
 
                fread (&len,sizeof(int),1,F);
                fread (&Enew->End_Parametr,len,1,F);
 
                if(E0 == NULL) E0 = Enew;
                else Eold->pr = Enew;
                Eold = Enew;
               
         }
fclose(F);

Однако выдает ошибку....И ассемблеровское окно.Наверняка ссылаюсь куда-нибудь в несуществующее место.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
21.04.2009, 14:33     Структура самоадресуемая #6
Читать приблизительно так (не проверял!):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Enew=new TEtl;
while (!ifile.eof())
{
int len=0;
 
fread (&len,sizeof(int),1,F);
char str = new char[len+1];
fread (str,len,1,F);
str[len] = '\0';
Enew->Meropr = str;
delete[] str;
 
// ...
 
if(E0 == NULL) E0 = Enew;
else Eold->pr = Enew;
Eold = Enew;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2009, 15:52     Структура самоадресуемая
Еще ссылки по теме:

Структура - C++
Не получается записать строки через функцию gets(), не пойму что не так: Ошибка C4996 'gets': This function... //...

Структура в С++ - C++
Добрый день всем! Вот моё задание: Известны фамилии 25 человек, их семейное положение: женат (замужем) или нет, и сведения о наличии...

структура с++ - C++
Скажите, пожалуйста, в чем ошибка. почему не считает средний бал, фамилии, классы? #include <iostream.h> #include <stdio.h> ...

структура - C++
Помогите Создать структуру для работы с матрицей. Данные структуры: матрица A(3×3). Создать функции: ввод матрицы, вывод матрицы в...


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

Или воспользуйтесь поиском по форуму:
TitoAlehandro
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 6
21.04.2009, 15:52  [ТС]     Структура самоадресуемая #7
работает...огромное спасибо
Yandex
Объявления
21.04.2009, 15:52     Структура самоадресуемая
Ответ Создать тему
Опции темы

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