Форум: "Начинающим";
Текущий архив: 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