Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.02.2012, 13:33
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию Проблема при чтении record из потока

Добрый день, уважаемые форумчане.

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

Суть:
Была record, полям которой присваивались значения некоторых переменных, а потом эта запись заливалась в файл.
В другом методе из этого файла считывались данные и заливались в эту же record. Все работало отлично и без нареканий, пока я не решил добавить в запись новое поле. Проблема возникла при чтении данных из файла - в это новое поле не пишется ничего, хотя все остальные поля прогружаются исправно.

Привожу кусок кода. Может быть замыленный взгляд пропустил какую-то мелочь. Заранее спасибо за помощь.

Код:
var
  Count: integer;  
  protocol: string= '0.04.02.00';
  ...

type
  RTempField= record //для справки в ней так же есть и массивы.
    ...
    count: integer;
    protocol: string; //вот проблемное поле. пробовал менять тип на integer (с изменением типа переменной разумеется) - результата не принесло.
    ...
  end;

procedure TMasField.SaveToFile(FileName: string);
var
  TempField: RTempField;
  FileData: TFileStream;
begin
  ...
  TempField.count:= Count;
  TempField.protocol:= protocol; //прогонял дебаггером - в поле записи значение стоит
  ...
  FileData:= TFileStream.Create(FileName, fmCreate);
  FileData.Write(TempField, sizeof(TempField));
  FileData.Free;
end;

procedure TMasField.LoadFromFile(FileName: string);
var
  FileData: TFileStream;
  TempField: RTempField;
begin
  FileData:= TFileStream.Create(FileName, fmOpenRead);
  FileData.Read(TempField, sizeof(TempField));
  FileData.Free;
  if (TempField.protocol) < (protocol) then //А вот здесь в поле записи уже стоит "", хотя должно быть загружено из файла.
    begin
      ...
    end;  
  Count:= TempField.count; //Тут все работает нормально.
  ...  
end;
Ответить с цитированием
  #2  
Старый 18.02.2012, 17:19
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Думаю, следует ограничить размер всех STRINGовых полей записи.
Код:
var
  Count: integer;  
  protocol: string[10]= '0.04.02.00';
  ...

type
  RTempField= record //для справки в ней так же есть и массивы.
    ...
    count: integer;
    protocol: string[10]; //вот проблемное поле. пробовал менять тип на integer (с изменением типа переменной разумеется) - результата не принесло.
    ...
  end;
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #3  
Старый 18.02.2012, 18:59
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Думаю, следует ограничить размер всех STRINGовых полей записи.
Спасибо, но не помогло.
Думал, что может быть protocol - какое-то системное имя, но переименование тоже результата не дало.
Ответить с цитированием
  #4  
Старый 18.02.2012, 20:13
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Код:
type
  RTempField= record //для справки в ней так же есть и массивы.
   end;
Какие массивы? Можно полностью увидеть стуктуру записи?
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #5  
Старый 18.02.2012, 20:30
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Какие массивы? Можно полностью увидеть стуктуру записи?
да, конечно. вот.

Код:
  RTempField= record
    Mas: array[1..8, 1..8] of byte;
    FieldOwner: array[1..8, 1..8] of byte;
    side: byte;
    players: byte;
    count: integer;
    protocol: string;
    AbsLose: array[1..4] of boolean;
  end;

Про массивы это я к тому, что там не только integer'ы. И что все нормально туда обратно выгружается, кроме почему-то вот этого одного поля.
Ответить с цитированием
  #6  
Старый 18.02.2012, 21:25
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Для начала нужно в обязательном порядке перегрузить Дельфи (имеется у него такой глюк), затем желательно ограничить String, далее "прошагать" проблемное место.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #7  
Старый 18.02.2012, 22:47
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от angvelem
Для начала нужно в обязательном порядке перегрузить Дельфи (имеется у него такой глюк), затем желательно ограничить String, далее "прошагать" проблемное место.

Проблема повторяется уже третий день, String ограничил, отладчик при сохранении в файл показывает, что в переменной значение есть, а при загрузке - что она пустая.
Открывать файл hex-редактором пробовал, но толку мало.
В какую еще сторону глядеть не могу даже представить.

p.s. Да и стал бы я напрягать других людей, не поискав прежде причину сам =)

Последний раз редактировалось nixel, 18.02.2012 в 22:58.
Ответить с цитированием
  #8  
Старый 18.02.2012, 23:06
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Повторюсь, "прошагать". Ставишь курсор на строку где начинается чтение файла и далее F7, F8, в зависимости от того, нужно входить в какие-либо процедуры/функции или "перескочить" их. Чтобы сразу попасть на нужную строку, жмём F4.
Кстати, обратил внимание. Почему record без указания packed? И не стал бы я такую структуру читать через TFileStream, BlockRead и все дела.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.

Последний раз редактировалось angvelem, 18.02.2012 в 23:13.
Ответить с цитированием
  #9  
Старый 18.02.2012, 23:11
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от angvelem
Повторюсь, "прошагать". Ставишь курсор на строку где начинается чтение файла и далее F7, F8, в зависимости от того, нужно входить в какие-либо процедуры/функции или "перескочить" их. Чтобы сразу попасть на нужную строку, жмём F4.

Под отладчиком я имел ввиду весь инструментарий отладки: и проход кода построчно, и watches и много чего еще. Разве что содержимое памяти и ассемблерную мнемонику не просматривал, ибо не разбираюсь.
Ответить с цитированием
  #10  
Старый 18.02.2012, 23:31
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ух тяжко:
Код:
type
  TTempField= record
    Mas: array[1..8, 1..8] of byte;
    FieldOwner: array[1..8, 1..8] of byte;
    side: byte;
    players: byte;
    count: integer;
    protocol: string;
    AbsLose: array[1..4] of boolean;
  end;

var
  TempField : TTempField;
...
читаем
...
var
  FileIn : File of TTempField;
begin
  AssignFile(FileIn, 'MyFile');
  Reset(FileIn);
  Read(FileIn, TempField]);
  CloseFile(FileIn);
end;
...
пишем
...
var
  FileOut : File of TTempField;
begin
  AssignFile(FileOut, 'MyFile');
  Rewrite(FileOut);
  Write(FileOut, TempField]);
  CloseFile(FileOut);
end;
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
nixel (18.02.2012)
  #11  
Старый 18.02.2012, 23:38
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Интересное решение. В скором времени попробую и отпишусь. Спасибо.
Ответить с цитированием
  #12  
Старый 19.02.2012, 19:00
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Спасибо всем за ответы.
Проблема решилась очень просто: я три дня каждый раз грузил из файла (через opendialog) в котором вообще нет данных о поле protocol.
Извините за потраченное время.

p.s. Заработало и с потоками, так что не пришлось переделывать код под работу с типизированным файлом.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:06.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025