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

Вниз

Проблемка с записью строк в фаил   Найти похожие ветки 

 
GTR ©   (2005-10-14 21:12) [0]

Уважаемые знатоки прошу у вас совета :)
Смысл в чем...надо записать массив записей в фаил, запись содержит в себе integer и string (длина неизвестна).
Пытаюсь записать в TFileStream:
SetLength
SetLength(string,Length(string));
и потом
file.Write(Length(string),sizeof(integer)) ; //запоминаю длину строки чтобы
её считать из файла.
file.Write(string,Length(string)) ;
можно было записать
При считывании из файла
file.Read(length_str,sizeof(integer)); //считываю длину строки
file.Read(string,length_str); //должна считаться строка

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

Пооги плиз :)


 
begin...end ©   (2005-10-14 21:24) [1]

> GTR ©   (14.10.05 21:12)

> file.Write(string,Length(string))

FileStream.Write(Str[1], Length(Str))

> file.Read(string,length_str)

FileStream.Read(Str[1], length_str)

И нужную длину строки перед чтением в неё установить не забудьте.


 
GTR ©   (2005-10-14 23:09) [2]

я это и делаю (прошу прошения немного перепутал коды) :
var
str:string;
str_len:integer;
f:TFileStream;
begin
SetLength(str,length(str));
f:=TFileStream("data.dat",fm_Create);
i:=sizeof(str);
f.Write(i,sizeof(i));
f.Write(str,i);
f.Free;
-----
Процедура чтения:
var
str:string;
str_len:integer;
f:TFileStream;
begin
f:=TFileStream("data.dat",fm_Open);
f.Read(i,sizeof(i));
SetLength(str,i);
f.Read(str,i);
f.Free;


 
Virgo_Style ©   (2005-10-14 23:58) [3]

GTR ©   (14.10.05 23:09) [2]

в [1] кое-что жирным шрифтом выделено...

GTR ©   (14.10.05 21:12)
причем..если в одной процедуре...


не совсем ясно, в чем отличие 1-го способа от второго. Я надеюсь, запись и чтение происходят не одновременно?


 
Плохиш ©   (2005-10-15 00:45) [4]


> GTR ©   (14.10.05 23:09) [2]

Тонко намекну: SizeOf(str) = 4


 
GTR ©   (2005-10-15 05:42) [5]

FileStream.Write(Str[1], Length(Str))
Ведь в ней  считывается строка единичной длины (проще говоря символ), а если длина строки 22 ?
Чем данная строка отличается от
f.Read(i,sizeof(i));
?

Поясню немного на счет процедур:
на форме имеется button1,Edit1,button2,label1.

procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i:integer;
f:TFileStream;
begin
f:=TFileStream.Create("data.dat",fmCreate);
s:=Edit1.Text;
Setlength(s,length(s));
i:=length(s);
f.Write(i,sizeof(i));
f.Write(s,i);
f.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
s2:string;
i2:integer;
f2:TFileStream;
begin
f2:=TFileStream.Create("data.dat",fmOpenRead);
f2.Read(i2,4);
SetLength(s2,i2);
f2.Read(s2,i2);
f2.Free;
Label1.Caption:=s2;
end;

Если сначала нажать Button1, то есть создать фаил и записать в него строку, а потом Button2, то строка считывается, но не вся а токо четное кол-во символов (если исходная строка qwe, то считается qw; если исходная qwer, то считывается qwer),
Но при попытке сделать следующее:
Запустить программу, записать фаил кнопкой Button1, выйти из программы, запустить её заного, и нажать кнопку Button2, то получается что Label1 выдает неизвестный текст :(.


 
Anatoly Podgoretsky ©   (2005-10-15 10:38) [6]

Плохиш ©   (15.10.05 00:45) [4]
Намек неудачный и он ему глупо последовал.

GTR ©   (14.10.05 23:09) [2]
SetLength(str,length(str));

Что здесь сказать то хотел? установить длину S равной длине S, масло сделать масляным.

Прочитай внимательно Virgo_Style ©   (14.10.05 23:58) [3], все дело в этом


 
palva ©   (2005-10-15 11:28) [7]

> FileStream.Write(Str[1], Length(Str))
Ведь в ней  считывается строка единичной длины (проще говоря символ), а если длина строки 22 ?

Нет не так. Первый параметр метода Write описан как нетипизированный const, это значит метод принимает данные любого типа в виде указателя на начало данных. Длина данных указывается явно во втором параметре. Когда вы пишете
Write(Str, Length(Str))
то вы передадите адрес четырехбайтового указателя (которым фактически является строка) и запишите в файл этот указатель и тот мусор, который следует за этим указателем в памяти. Ни один символ строки в файл при этом не попадает.


 
Плохиш ©   (2005-10-15 12:45) [8]


> Anatoly Podgoretsky ©   (15.10.05 10:38) [6]
> Плохиш ©   (15.10.05 00:45) [4]
> Намек неудачный и он ему глупо последовал.

Он ему последовал? Где? Он его даже не понял? :-)

> GTR ©   (15.10.05 05:42) [5]
> FileStream.Write(Str[1], Length(Str))
> Ведь в ней  считывается строка единичной длины (проще говоря
> символ), а если длина строки 22 ?
> Чем данная строка отличается от
> f.Read(i,sizeof(i));

Ты хочешь, чтобы тебе здесь начали перепечатывать книги по программированию? Фигушки. Придётся тебе самому заняться теорией.

PS. Скоро ветку отправять в потрепаться, там и поприкалываемся.



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

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

Наверх




Память: 0.47 MB
Время: 0.035 c
1-1129116524
Fl@sh
2005-10-12 15:28
2005.11.06
TFileStream+BlockRead+сохранить массив классов


14-1129217046
ArtemESC
2005-10-13 19:24
2005.11.06
Дизассемблер-редактор


11-1110873009
hotes
2005-03-15 10:50
2005.11.06
Вопрос по KolOGL12


3-1127308032
Juice
2005-09-21 17:07
2005.11.06
Модификация через сетку табл. без ключей


9-1119607415
rsy
2005-06-24 14:03
2005.11.06
Демка моего Тениса





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский