Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2013, 21:44   #11
Des80
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
это Вы о чём?..
О программировании. Это настоящее волшебство!
Des80 вне форума Ответить с цитированием
Старый 11.09.2013, 23:39   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Des80 Посмотреть сообщение
О программировании. Это настоящее волшебство!


согласен!


Задачу вашу Вам, надеюсь, удалось решить? Всё получилось?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.09.2013, 18:28   #13
Des80
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение


согласен!


Задачу вашу Вам, надеюсь, удалось решить? Всё получилось?
Нет, что то не выходит.

Вот запись файла:
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
f:file;
i:integer;
n,size:longint;
s:Tstats;
begin
s:=Tstats.Create;
s.AddPm('1',3,'34/55vbbcvbcbcv',32,2,54,7,3);
s.AddPm('1',3,'88/38888888888888',32,2,54,7,3);
assignfile(f,'D:/13.stats');
rewrite(f);
n:=s.pmcount;
blockwrite(f,n,sizeof(longint));
for I := 0 to n-1 do
begin
  BlockWrite(f,s.Pm[i].id,sizeof(integer));
  BlockWrite(f,s.Pm[i].id,sizeof(integer));

  size:=length(s.pm[i].name);
  BlockWrite(f,size,sizeof(longint));
  BlockWrite(f,s.Pm[i].Name,length(s.Pm[i].name));

  BlockWrite(f,s.Pm[i].games,sizeof(integer));

  size:=length(s.pm[i].score);
  BlockWrite(f,size,sizeof(longint));
  BlockWrite(f,s.Pm[i].Score,length(s.Pm[i].Score));

  BlockWrite(f,s.Pm[i].ratio,sizeof(real));
  BlockWrite(f,s.Pm[i].frags,sizeof(real));
  BlockWrite(f,s.Pm[i].deaths,sizeof(real));
  BlockWrite(f,s.Pm[i].suicides,sizeof(real));
  BlockWrite(f,s.Pm[i].teamkills,sizeof(real));
end;
closefile(f);
end;
Вот чтение:
Код:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
f:file;
i:integer;
n,size:longint;
s:Tstats;
begin
s:=Tstats.Create;
assignfile(f,'D:/13.stats');
reset(f);
seek(f,0);
n:=0;
//showmessage(inttostr(sizeof(longint)));
Blockread(f,n,sizeof(longint));
 for i := 0 to n - 1 do
 begin
 //
 end;
closefile(f);
//showmessage(s.Score);
end;
На строке Blockread возникает ошибка Read beyond end of file.
Подскажите что делать?
Вложения
Тип файла: rar тест.rar (311.9 Кб, 1 просмотров)

Последний раз редактировалось Stilet; 14.09.2013 в 20:32.
Des80 вне форума Ответить с цитированием
Старый 14.09.2013, 21:51   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Подпрограмма Reset по умолчанию открывает файл с размером записи равной 128 байт.
rewrite(f, 1);
reset(f, 1);

Кое-что можно написать проще.
Код:
procedure TStats.AddPm(FName: string; Fgames: integer; Fscore: string;
  Fratio: real; Ffrags, Fdeaths, FSuicides, Fteamkills: integer);
var
  k: integer;
begin
  k := length(Pm);
  setlength(Pm, k + 1);
  with Pm[k] do
  begin
    id := k + 2;
    Name := FName;
    games := Fgames;
    score := Fscore;
    ratio := Fratio;
    frags := Ffrags;
    deaths := Fdeaths;
    Suicides := FSuicides;
    teamkills := Fteamkills;
  end;
end;
Не забудьте, что в новых версиях Дельфи строки юникодовые (на символ 2 байта).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.09.2013 в 21:53.
BDA вне форума Ответить с цитированием
Старый 14.09.2013, 21:57   #15
Des80
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 21
По умолчанию

Уже сам решил проблему, изменив размер блока записи rewrite(f,1);

Теперь проблема в другом.

В файл нормально записывает и читает только если в Tstats записать константы. Если же я закидываю в Tstats значение переменой ( в данном случае u) то читает корректно опять же только не закрывая прогу. Если закрыть то в читаются совершенно левые значения. Например, у меня несколько раз читал из файла строку 'BitBtn1' .
Такое заметил, только со строками. Real,Integer нормально читает.

Объясните пожалуйста почему так происходит и как это исправить?

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
f:file;
i:integer;
n,size:longint;
s:Tstats;
u:string;
begin
s:=Tstats.Create;
u:='143423w';
s.AddPm('1',3,u,32,2,54,7,3);
u:='0994';
s.AddPm('1',3,u,32,2,54,7,3);
assignfile(f,'D:/13.stats');
rewrite(f,1);
n:=s.pmcount;
blockwrite(f,n,sizeof(longint));
for I := 0 to n-1 do
begin
  BlockWrite(f,s.Pm[i].id,sizeof(integer));

  size:=sizeof(s.Pm[i].Name);
  BlockWrite(f,size,sizeof(longint));
  BlockWrite(f,s.Pm[i].Name,size);

  BlockWrite(f,s.Pm[i].games,sizeof(integer));

  size:=sizeof(s.pm[i].score);
  BlockWrite(f,size,sizeof(longint));
  BlockWrite(f,s.Pm[i].Score,size);

  BlockWrite(f,s.Pm[i].ratio,sizeof(real));
  BlockWrite(f,s.Pm[i].frags,sizeof(real));
  BlockWrite(f,s.Pm[i].deaths,sizeof(real));
  BlockWrite(f,s.Pm[i].suicides,sizeof(real));
  BlockWrite(f,s.Pm[i].teamkills,sizeof(real));
end;
closefile(f);
end;
Des80 вне форума Ответить с цитированием
Старый 14.09.2013, 22:02   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
почему так происходит
Потому что современные строки это указатели, а не массивы символов.
Со строкой нужно поступать по другому:
Код:
BlockWrite(f,Строка[1],Length(Строка));
И учитывать что строки могут быть обьявлены как юникодные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2013, 22:29   #17
Des80
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
учитывать что строки могут быть обьявлены как юникодные.
Каким образом?
Des80 вне форума Ответить с цитированием
Старый 14.09.2013, 22:58   #18
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Des80 Посмотреть сообщение
Каким образом?
например, так:

Код:
BlockWrite(f,Строка[1],Length(Строка)*SizeOf(Char));
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.09.2013, 22:59   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Каким образом?
Ну а как ты их описал? String? Это юникод AnsiString? это однобайтовая ANSI строка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2013, 23:10   #20
Des80
Пользователь
 
Регистрация: 09.09.2013
Сообщений: 21
По умолчанию

Извините заранее за тупой вопрос, но чем тогда pchar отличается от string, если string это тоже указатель на начало строки?
Des80 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с типизированными файлами Макс Башкинов Помощь студентам 25 18.01.2013 11:49
Паскаль. Проблема с типизированными файлами:( Женька Good Помощь студентам 5 07.12.2011 23:41
Pascal. Проблема с типизированными файлами Женька Good Помощь студентам 2 29.11.2011 22:13
Работа с типизированными файлами Zalmancheg Помощь студентам 2 11.03.2011 23:15
Проблема с типизированными файлами Siluet Общие вопросы Delphi 1 04.10.2009 14:08