Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];

Вниз

Запись в файл переменной типа string.   Найти похожие ветки 

 
Fredericco   (2002-09-27 11:12) [0]

Привет уважаемые мастера!
У меня вот такой вопрос. Есть рекорд

TMyRec=record
I:integer;
S:String[255];
end;

и файл

F:File of TMyRec;

Данная структура не может быть записана в файл если не указать длину строки S. Так вот, кто уже с этим сталкивался, подскажите пожалуйста как правильней всего записывать строки большей длины.

С уважением к Мастерам.
Fredericco.


 
Anatoly Podgoretsky   (2002-09-27 11:22) [1]

Данная структура может быть записана в файл без указания длины строки S


 
MBo   (2002-09-27 12:43) [2]

если в записи длинные строки или дин.массивы, File of TMyRec не пойдет, используй TFilestream, перед строкой записывая ее длину


 
Fredericco   (2002-09-27 13:49) [3]

2Anatoly Podgoretsky © (27.09.02 11:22)

[Error] Unit1.pas(103): Type "TDriver" needs finalization - not allowed in file type
[Fatal Error] Project1.dpr(5): Could not compile used unit "Unit1.pas"


2MBo © (27.09.02 12:43)
Расскажи пожалуйста, если не трудно, как организовать чтение/запись MyRec через TFileStream, а то я сам не разобрался.


 
Anatoly Podgoretsky   (2002-09-27 13:58) [4]

Ты уверен, что ты записываешь именно эту структуру, эту можно, а про другие надо отдельно говорить.


 
Alx2   (2002-09-27 13:59) [5]

у меня такая конструкция проходит (D5 & D6)
type
TMyRec=record
I:integer;
S:String[255];
end;
Var f : file of tmyrec;

:)

Если D4 таки упрямится (что вряд ли), то попробуй

type
TStrArray = array [0..255] of char;
TMyRec=record
I:integer;
S:TStrArray;
end;
Var f : file of tmyrec;

а при работе использовать приведение типов

но имхо неэкономны файлы такого типа.



 
MBo   (2002-09-27 14:00) [6]

FS.write(Rec.I, SizeOf(rec.I));
L:=Length(rec.s);
FS.write(L, SizeOf(L));
Fs.Write(rec.s[1],L);
...
fs.read(rec.i,SizeOf(rec.I));
fs.read(L,sizeof(Integer));
SetLength(rec.s,L);
Fs.read(rec.s[1],L);



 
Fredericco   (2002-09-27 14:02) [7]

2Anatoly Podgoretsky © (27.09.02 13:58)

Уверен. Только что проверил в новом проекте.

[Error] Unit1.pas(107): Type "TMyRec" needs finalization - not allowed in file type
[Fatal Error] Project1.dpr(5): Could not compile used unit "Unit1.pas"


 
Fredericco   (2002-09-27 14:03) [8]

2MBo © (27.09.02 14:00)

Спасибо большое!


 
Alx2   (2002-09-27 14:03) [9]

>Fredericco © (27.09.02 14:02)
Что то очень странное творится в королевстве датском :)


 
Fredericco   (2002-09-27 14:05) [10]

2Alx2 © (27.09.02 14:03)
Может потому что у меня D4.


 
Fredericco   (2002-09-27 14:10) [11]

2Alx2 © (27.09.02 14:03)
Прчти внимательней вопрос:

> Данная структура не может быть записана в файл если не указать
> длину строки S

То бишь:

TMyRec=record
I:integer;
S:String; // Не указав длину строки
end;


 
Anatoly Podgoretsky   (2002-09-27 14:14) [12]

Я не из головы беру, откомпилировано без единого предупреждения и выполнено без единой ошибки, файл как и ожидалось оказался ровно 260 байт и строго нужного содержания.
У тебя яно не тот код, который приведен в сообщении Fredericco © (27.09.02 11:12)

Естественно не было нужды делать пратическую проверку, это только для тебя, что бы ты не мог утверждаать, мол проверь сначала.


 
MBo   (2002-09-27 14:16) [13]

>Anatoly Podgoretsky
>Alx2

Новости телепатии:

Тот тип, который он привел, у него записывается, а если убирает [255] - тогда нет. Вот что он имел в виду


 
Fredericco   (2002-09-27 14:17) [14]

>Anatoly Podgoretsky
>Alx2

Новости подробного чтения:

> Данная структура не может быть записана в файл если не указать
> длину строки S



 
Alx2   (2002-09-27 14:28) [15]

>Fredericco © (27.09.02 14:17)
> быть записана в файл если не указать
> длину строки S

Теперь все понятно.

НО!
Длина строки <> ее размерность :))
Длина = length


>MBo © (27.09.02 14:16)
Не открыл еще фирму по ясновидению? :)


 
Alx2   (2002-09-27 14:29) [16]

>Данная структура не может быть записана в файл если не указать
>длину строки S.

И потом, в выясненном смысле, эта структура уже не "данная".


 
Anatoly Podgoretsky   (2002-09-27 14:32) [17]

MBo © (27.09.02 14:16)
Это будет другая структура, такая структура не имеет смысла для типизированныйх файлов, компилятор даже отказывается подобное компилировать. Налицо полное не понимание принципов.
Нужно использовать не типизированный файл, а двоичный с переменной структурой, с примером повторяться не буду, ты его привел в MBo © (27.09.02 14:00)

Мое сообщение Anatoly Podgoretsky © (27.09.02 11:22) и последующие только по приведенной структуре.


 
Fredericco   (2002-09-27 14:38) [18]

Помимо приведенной структуры, был еще приведен текст, на прочтение которого автор вопроса рассчитывал.


 
Fredericco   (2002-09-27 14:42) [19]

2Anatoly Podgoretsky © (27.09.02 14:32)

> Налицо полное не понимание принципов

Налицо невнимательное чтение.


 
Рыжик   (2002-09-27 14:52) [20]


> Anatoly Podgoretsky © (27.09.02 14:14)
> Я не из головы беру, откомпилировано без единого предупреждения
> и выполнено без единой ошибки, файл как и ожидалось оказался
> ровно 260 байт и строго нужного содержания.
> У тебя яно не тот код, который приведен в сообщении Fredericco
> © (27.09.02 11:12)

А у вас случайно не стоит {$H-}?
Потому что, если {$H+}, то ошибка должна быть.


 
pasha_golub   (2002-09-27 14:56) [21]


> Рыжик © (27.09.02 14:52)
Абсолютно прав (права)!!!


 
Anatoly Podgoretsky   (2002-09-27 15:03) [22]

MBo © (27.09.02 14:00)
Если про String[255] то ошибки не будет, если просто про String, то для {$H-} это навносильно String[255] оно же ShortString без всяких директив


 
Sectey   (2002-09-27 15:06) [23]

procedure WriteStr(str: string);
var
s : TFileStream;
l : integer;
begin
s := TFileStream.Create("sdsds",fmCreate);
l := length(str);
s.WriteBuffer(l,sizeof(l));
s.WriteBufffer(point(str)^,l);
s.Free
end;

function ReadStr: string;
var
s : TFileStream;
l : integer;
b : string;
begin
s := TFileStream.Create("sdsds",fmCreate);
s.ReadBuffer(l,sizeof(l));
SetLength(b,l);
s.ReadBufffer(point(b)^,l);
s.Free;
result := b;
end;


 
Sectey   (2002-09-27 15:08) [24]

О Ш И Б С Я.

b : string;
begin
s := TFileStream.Create("sdsds",fmOpenRead);
s.ReadBuffer(l,sizeof(l));


 
Fredericco   (2002-09-27 15:08) [25]

Sectey © (27.09.02 15:06)

Спасибо!


 
Anatoly Podgoretsky   (2002-09-27 15:18) [26]

Рыжик © (27.09.02 14:52)
По ошибке MBO адресовал, для string[255] без разницы


 
Рыжик   (2002-09-27 15:26) [27]

Имелось в виду, конечно, {$H+} для просто string. Сперва не правильно поняла, о чём речь. Прошу прощения за невнимательность.


 
Alx2   (2002-09-27 15:26) [28]

>Sectey © (27.09.02 15:08)
>Sectey © (27.09.02 15:08)
>О Ш И Б С Я.
И не только там.


 
Sectey   (2002-09-27 15:35) [29]

Alx2 © (27.09.02 15:26)
В чем?


 
Alx2   (2002-09-27 15:46) [30]


procedure WriteStr(str: string);
var
s : TFileStream;
l : integer;
begin
s := TFileStream.Create("sdsds",fmCreate);
l := length(str);
s.WriteBuffer(l,sizeof(l));
s.WriteBufffer( point(str)^,l);
s.Free
end;

function ReadStr: string;
var
s : TFileStream;
l : integer;
b : string;
begin
s := TFileStream.Create("sdsds",fmCreate);
s.ReadBuffer(l,sizeof(l));
SetLength(b,l);
s.ReadBufffer( point(b)^,l);
s.Free;
result := b;
end;




 
Sectey   (2002-09-27 15:52) [31]

>Alx2 © (27.09.02 15:46)

Да все правельно.
Передаем записи и чтения данные string, а не переменную String.


 
Fog   (2002-09-27 15:54) [32]

А что если
File of PChar;
.
.
.
Write(.., PChar(Твой стринг));



 
Sectey   (2002-09-27 15:59) [33]

>Fog © (27.09.02 15:54)

В файл же надо сохранить данные, а НЕ АДРЕСА где располагаются данные.


 
Alx2   (2002-09-27 16:05) [34]

>Sectey © (27.09.02 15:52)
>Да все правельно.
point, конечно, не pointer - но это просто опечатка.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.01 c
4-21327
cdaDmitriy
2002-08-15 15:11
2002.10.07
TRAY


1-21031
Bond
2002-09-26 17:53
2002.10.07
Спасайте, мастера! Реакция на событие Ctrl + PgUp


14-21240
AL2002
2002-09-12 10:52
2002.10.07
Люди, вы пользуетесь прогой Offline Explorer Pro 2.4?


4-21342
Timur_2002
2002-08-19 13:30
2002.10.07
Как на WinAPI рисовать картинки через OwnerDraw во всплыв. меню?


14-21210
DeMoN-777
2002-09-11 12:50
2002.10.07
Народ у кого-нить есть компонент





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский