Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 2 / 3
Регистрация: 25.10.2019
Сообщений: 54

Проблемы с чтением/записью классов в файл

17.04.2021, 00:13. Показов 1344. Ответов 3

Студворк — интернет-сервис помощи студентам
Всем привет.
Стоит задача создать файл из экземпляров классов, чтобы можно было сохранять и считывать эти экземпляры.

Есть класс и файл:
Кликните здесь для просмотра всего текста

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
Parabola = class
    a: single;
    b: single;
    c: single;
    procedure MakeRandomParabola();
    procedure EnterParabola();
    function ParabolaToString(): string;
    function SolutionsDelta(): single;
    constructor Create();
  end;
 
  ParabolaFile = file of Parabola;

Есть реализация методов класса:
Кликните здесь для просмотра всего текста

Pascal
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
constructor Parabola.Create();
begin
  Self.a := 0;
  Self.b := 0;
  Self.c := 0;
end;
 
procedure Parabola.MakeRandomParabola();
begin
  randomize();
  Self.a := random(100) / 10;
  Self.b := random(100) / 10;
  Self.c := random(100) / 10;
end;
 
procedure Parabola.EnterParabola();
begin
  Self.a := StrToFloat(InputBox('Ввод', 'Введите параметр a', ''));
  Self.b := StrToFloat(InputBox('Ввод', 'Введите параметр b', ''));
  Self.c := StrToFloat(InputBox('Ввод', 'Введите параметр c', ''));
end;
 
function Parabola.ParabolaToString(): string;
var
  res: string;
begin
  res := 'y=' + FloatToStr(Self.a) + '*x^2+' + FloatToStr(Self.b) +
    '*x+' + FloatToStr(Self.c);
  Result := res;
end;
 
function Parabola.SolutionsDelta(): single;
var
  D: single;
  x1, x2: single;
  res: single;
begin
  D := sqr(Self.b) - 4 * Self.a * Self.c;
  if (D > 0) then
  begin
    x1 := (-Self.b + sqrt(D)) / (2 * Self.a);
    x2 := (-Self.b - sqrt(D)) / (2 * Self.a);
    res := abs(x2 - x1);
  end
  else
    res := 0;
  Result := res;
end;


Вызываю чтение и запись процедурами из отдельного модуля:
Кликните здесь для просмотра всего текста

Pascal
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
procedure CreateParabolaFile(fileName: string);
var
  f: ParabolaFile;
  i, Count: integer;
  mode: integer;
  buf: Parabola;
begin
  mode := StrToInt(InputBox('Ввод',
    'Введите режим. 1 - ввод парабол вручную, 2 - ввод случайных парабол',
    ''));
  Count := StrToInt(InputBox('Ввод',
    'Введите количество вводимых парабол', ''));
  AssignFile(f, fileName);
  rewrite(f);
  reset(f);
  for i := 1 to Count do
  begin
    buf := Parabola.Create();
    case mode of
      1: buf.EnterParabola();
      2: buf.MakeRandomParabola();
    end;
    Write(f, buf);
  end;
  CloseFile(f);
end;
 
function ReadFile(fileName: string): TStrings;
var
  f: ParabolaFile;
  res: TStringList;
  bufP: Parabola;
  bufS: string;
begin
  res := TStringList.Create();
  AssignFile(f, fileName);
  Reset(f);
  while not EOF(f) do
  begin
    bufP := Parabola.Create();
    Read(f, bufP);
    bufS := bufP.ParabolaToString();
    res.Add(bufS);
  end;
  CloseFile(f);
  Result := res;
end;


Проблема в том, что файл не сохраняется/не читается как надо. Я ставил вывод промежуточных значений при создании экземпляров при создании файла и там все в порядке, но при чтении из файла читаются одни и те же значения. Если закрыть программу и опять запустить ее и считать файл, то считаются просто нули.
Кликните здесь для просмотра всего текста


Сначала Parabola была Рекордом и все работало отлично, но потом мне сказали что в этой задаче обязательно создавать методы внутри структуры, так что я переделал с классом и теперь оно не работает
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2021, 00:13
Ответы с готовыми решениями:

Проблемы с чтением и записью в файл в Юникоде
Добрый день. Есть код: Запись в файл: Option Explicit Sub SavingCaseAsUnicodeFile() Dim FileName, SheetName As String,...

Проблемы с чтением и записью двух однонаправленных сокетов
Добрый день, прошу подсказать как решить проблемы с чтением и записью в сокет. У меня есть два однопоточных сервер-клиент, то есть клиент...

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

3
Native x86
Эксперт Hardware
 Аватар для quwy
6859 / 3791 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
17.04.2021, 00:26
Классы pascal/delphi нельзя записывать или читать из файла, нельзя передавать или принимать по сети, нельзя вообще пытаться вывести их за пределы программы или ввести извне. Классы здесь -- это динамические структуры, которые "размазаны" по памяти большим количеством мелких блоков и работают они только локально. Для обмена с внешним миром есть структуры (record), которые объявляются почти так же, но хранятся единым блоком и могут быть выгружены или загружены.
0
2 / 2 / 3
Регистрация: 25.10.2019
Сообщений: 54
17.04.2021, 00:50  [ТС]
Цитата Сообщение от quwy Посмотреть сообщение
Для обмена с внешним миром есть структуры (record),
Да, я их изначально и использовал, но заказчик сказал, что обязательно должны быть методы в структуре, но в паскале так нельзя, а с классами, получается, чтение/запись работать не будут. А есть какой-нибудь еще способ впихнуть методы в структуру?
0
Native x86
Эксперт Hardware
 Аватар для quwy
6859 / 3791 / 1026
Регистрация: 13.02.2013
Сообщений: 11,861
17.04.2021, 01:47
Лучший ответ Сообщение было отмечено Adefe как решение

Решение

Цитата Сообщение от Adefe Посмотреть сообщение
но заказчик сказал, что обязательно должны быть методы в структуре
А заказчику какое дело до тонкостей реализации?

Цитата Сообщение от Adefe Посмотреть сообщение
А есть какой-нибудь еще способ впихнуть методы в структуру?
Просто добавьте строку
Pascal
1
{$MODESWITCH ADVANCEDRECORDS}
в начало файла сразу после {$MODE objfpc}, где нужны такие рекорды.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2021, 01:47
Помогаю со студенческими работами здесь

Проблема с чтением из БД Oracle и записью в файл
Всем доброго времени суток. Пишу софтинку для автоматической генерации файлов CSV, данные грузятся в потоке из Oracle. Проблема возника в...

Не могу разобраться чтением и записью в файл
Тема моей курсовой работы "разработка программы определения размера стихотворения". В краце мне нужно считать из текстового файла все...

Нужно написать программу с чтением/записью в файл (потоки)
Помогите пожалуйста, в изучении Java я новичок, задали задание (изучаем потоки) следующего характера: Написать программу, которая...

STM32: FatFS & USB Host & Flash - проблемы с чтением/записью
Уважаемые гуру! Ломаю голову, но найти разумное объяснение симптомам не могу. Есть stm32f407. В Кубе создается проект с USB Host...

Путаница с записью классов в файл
Здравствуйте. Имеется несколько классов-наследников (B, C, D, например) абстрактного класса A. Имеется так же вектор: ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru