Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не типизированный файл 
:(
    Опции темы
Я
Дата 25.11.2004, 09:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть структура
Код

type
 FileData = array of record
   Number: integer;    
   FullPath: string;  
   NumOfPlay: integer;
   Rep: integer;      
 end;

В процессе соответсвенно структура заполняется и надо бы её сохранить в файл.
Делаю так:
Код

procedure TForm1.Button2Click(Sender: TObject);
var
 f: file;
begin
 assignfile(f,'c:\file.txt');
 rewrite(f);
 BlockWrite(F, GenFileData, SizeOf(GenFileData));
end;

Фаил создается, его размер 16384б и не зависимо от количество записей не меняется.
Соответсвенно при чтении из него структура остается обсалютно пустой.
Плиз хелп.
  Вверх
Akella
Дата 25.11.2004, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



а ты не пробовал использовать reset
PM MAIL   Вверх
Я
Дата 25.11.2004, 10:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пробывал - эффект тот же.

  Вверх
Satana
Дата 25.11.2004, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: 1
Всего: 5



А ты не пробовал использовать типизированный файл? или чем он тебя не устраивает?
должно быть чтото типа такого:
Код

type
FileData = array of record
  Number: integer;    
  FullPath: string;  
  NumOfPlay: integer;
  Rep: integer;      
end;



...



procedure TForm1.Button2Click(Sender: TObject);
var
f: file of filedata;
data: FileData
begin
assignfile(f,'c:\file.txt');
rewrite(f);
//заполняешь структуру
Write(F, n);
end;





--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
я
Дата 25.11.2004, 10:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Satana
Для типизированного файла:
должно быть FullPath: string[255];
Мне это не подходит потому как переменная может выходить за 256 символов (((

  Вверх
SlaUr
Дата 25.11.2004, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 18.9.2003

Репутация: 3
Всего: 5



По моему можно обьявить st1:array [1..1000] of char (если я не ошибаюсь)

Это сообщение отредактировал(а) SlaUr - 25.11.2004, 10:39
PM MAIL   Вверх
Pakshin A. S.
Дата 25.11.2004, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



можно исхитриться... ставить разделители в файле, например посалить какой-нить ASCII код... получим следующее:
Number#FullPath#NumOfPlay#Rep#
Только читаться немного дольше будет... smile

Читаем до первого... до второго... до третьего.. до четвертого... получили всё необходимое, если надо повторили... конец по EOF
PM   Вверх
Guest
Дата 25.11.2004, 12:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Pakshin A. S.
Да, я тоже к такому выводу пришел, но не хотелось бы так извращаться smile
  Вверх
Snowy
Дата 25.11.2004, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Ну во-первых нужно давать ReWrite(fn,1) или использовать file of byte.
А во-вторых, если строка неограниченной длинны, то в файл будет кидаться по максимуму. Так что придется кидать все элементы по одному, а перед строкой дополнительно давать размер строки. Просто так рекорд с неограниченной строкой не закинуть.
Код

type
 FileData = record
   Number: integer;    
   NumOfPlay: integer;
   Rep: integer;      
   FullPath: string;  // строку пихаем в конец, т.к. размер плавает
 end;
// ------
procedure Save(fd:FileData); // сохранить элемент типа FileData
var
 f: file of byte;
 i: integer;
begin
 assignfile(f,'c:\file.txt');
 rewrite(f);
 BlockWrite(F, fd, SizeOf(integer)*3); // сохраняем первые 3 интегера
 i:=Length(fd.FullPath); // берем длину стринга
 BlockWrite(F, i, SizeOf(integer)); // пихаем в файл
 BlockWrite(F, fd.FullPath, i); // пихаем данные стринга (ругнется, если ='' - поставь проверку
 CloseFile;
end;

procedure Read(var fd:FileData); // читаем 1 элемент типа FileData
var
 f: file of byte;
 i: integer;
begin
 assignfile(f,'c:\file.txt');
 reset(f);
 BlockRead(F, fd, SizeOf(integer)*3); // читаем первые 3 интегера
 BlockRead(F, i, SizeOf(integer)); // читаем длину строки
 SetLength(fd.FullPath, i); //создаем строку нужной длины
 BlockRead(F, fd.FullPath, i); // читаем в нее данные из файла
 CloseFile;
end;



Вот что-то вроде этого. Я не тестил, возможно сразу не сработает, но отладить можно.
А напрямую писать структуру бесполезно - типизированный файл должен иметь одинаковый размер всех элементов, а он не ограничен...
Для сохранения массива нужно вынести открытие и закрытие наружу и вызывать Save или Read в цикле.

Это сообщение отредактировал(а) Snowy - 25.11.2004, 13:22
PM MAIL   Вверх
Alex
Дата 25.11.2004, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



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


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Satana
Дата 25.11.2004, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: 1
Всего: 5



Alex Хорошо больше не буду...


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Medved
Дата 27.11.2004, 04:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154




 ! 
 
Вы хоть пробывали скомпилить то, что приводите Satana,Snowy? Если уж помогаете, то делайте это добросовестно. Ни один из приведенных кодов не скомпилиться. Это видно даже на вскидку. Хотел поставить минусы, но передумал. Это последнее предупреждение.



--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
z-END
Дата 27.11.2004, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



Дабы многоувожаемый Pegas никому не поставил по минусу, выкладываю свой вариант решения:
1. немного видоизменим описание типа:
Код

type
TFileData = record
  Number: integer;
  FullPath: string[255]; // если надо больше то можно использовать конструкцию  Array[0..xxxx] of Char;
  NumOfPlay: integer;
  Rep: integer;
end;

Var TheFileData: array of TFileData;

2. Для сохранения:
Код

procedure TForm1.Save(Sender: TObject);
var
f: file;
Count,fLen: Integer;
begin
assignfile(F,'c:\file.txt');
rewrite(F,1);
fLen:=Length(TheFileData);
BlockWrite(F,fLen, SizeOf(Integer));
for Count:=0 to fLen-1 do
 BlockWrite(F, TheFileData[Count], SizeOf(TFileData));
CloseFile(F);
end;

3. Для чтения:
Код

procedure TForm1.Load(Sender: TObject);
var
f: file;
Count, fLen: Integer;
begin
assignfile(F,'c:\file.txt');
Reset(F,1);
BlockRead(F,fLen,SizeOf(Integer));
SetLength(TheFileData,fLen);
for Count:=0 to fLen-1 do
 BlockRead(F, TheFileData[Count], SizeOf(TFileData));
CloseFile(F);
end;

ЗЫ надеюсь мой код рабочийsmile


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Snowy
Дата 29.11.2004, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



1. Можно помочь просто примером кода. Пример структуры, пример конструкции, пример использования функции и т.п.
2. Не у всех есть время, чтобы полностью все проверить и отладить. Времени жалко но разве это повод не помочь человеку?
3. Человек не защищен он опечаток и мелких ошибок. Я свой код набивал прямо в браузере, поэтому нет ничего ужасного в том, что я забыл поставить (f) после CloseFile.

Теперь по теме. В моем коде нужно добавить (f) после обеих CloseFile и добавить [1] после fd.FullPath. Теперь уж проверил. Точно работает. Можете взять старый код, исправить эти недочеты и все заработает.

Пойдем далее. Так уж и быть, потратил время, сделал РАБОЧИЙ код по циклы.
Код

program Project;
{$APPTYPE CONSOLE}
uses
 SysUtils;

type
 FileData = record
   Number: integer;
   NumOfPlay: integer;
   Rep: integer;
   FullPath: string;  // строку пихаем в конец, т.к. размер плавает
 end;

var
 f: file of byte;
 a,b: array[1..20] of FileData;
 i: integer;
// ------
procedure Save(fd:FileData); // сохранить элемент типа FileData
var
 i: integer;
begin
 BlockWrite(f, fd, SizeOf(integer)*3); // сохраняем первые 3 интегера
 i:=Length(fd.FullPath); // берем длину стринга
 BlockWrite(f, i, SizeOf(integer)); // пихаем в файл
 if i>0 then BlockWrite(f, fd.FullPath[1], i); // пихаем данные стринга
end;

procedure Read(var fd:FileData); // читаем 1 элемент типа FileData
var
 i: integer;
begin
 BlockRead(f, fd, SizeOf(integer)*3); // читаем первые 3 интегера
 BlockRead(f, i, SizeOf(integer)); // читаем длину строки
 if i>0 then begin
   SetLength(fd.FullPath, i); //создаем строку нужной длины
   BlockRead(f, fd.FullPath[1], i); // читаем в нее данные из файла
 end else fd.FullPath:=''; // пустых строк нет в файле!
end;

 // Начинаем тест работоспособности кода:
begin
 for i:=1 to 40 do
 begin
   a[i].Number:=20+i;
   a[i].NumOfPlay:=30+i;
   a[i].Rep:=40+i;
   a[i].FullPath:='Hello '+IntToStr(i)+'`st World!';
 end;

 assignfile(f,'c:\file.txt');
 rewrite(f);
 for i:=1 to 40 do Save(a[i]);
 CloseFile(f);
 //---
 Reset(f);
 for i:=1 to 40 do Read(b[i]);
 CloseFile(f);

 for i:=1 to 40 do
 begin
   WriteLn(b[i].Number);
   WriteLn(b[i].NumOfPlay);
   WriteLn(b[i].Rep);
   WriteLn(b[i].FullPath);
 end;
end.


Код работает, проверен. Можно переделывать под свои нужды. Размер файла с данными гораздо меньше, чем при использовании фиксированного рекорда.
PM MAIL   Вверх
p0s0l
Дата 29.11.2004, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата(Pegas @ 27.11.2004, 04:35)
Вы хоть пробывали скомпилить то, что приводите Satana,Snowy? Если уж помогаете, то делайте это добросовестно. Ни один из приведенных кодов не скомпилиться. Это видно даже на вскидку. Хотел поставить минусы, но передумал. Это последнее предупреждение.
Зря ты так, Pegas... smile
Это жестоко - ставить минус человеку за попытку помочь...
Так можно отбить у людей всё желание помогать...

Согласен с Snowy, я тоже иногда пишу код прямо в браузере, не проверяя на работоспособность/компилируемость... Особенно, когда нужно показать не рабочий код, а только идею, наброски реализации...



--------------------
С уважением, г-н Посол.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0979 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.