Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Строки и файлы


Автор: PsiMagistr 9.7.2010, 17:01
Ребята, если вам не сложно обясните мне следующую вещь.

Записываю строку в файл через FileStream: (Я в курсе что есть более удобные способы)

Объявляем глобально:

Код

var F:TfileStream;


Обработчик кнопки записи:

Код

procedure TForm1.Button1Click(Sender: TObject);
var S1 :String[255]; //Переменная записи.
begin
S1:= T.Text; //T это просто текстовое поле.
F:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'Какой-то файл', fmCreate);
F.Seek(0,soFromBeginning);
F.Write(S1, Sizeof(S1));
F.Free;
end;


А теперь пытаемся прочесть. Обработчик кнопки чтения:

Код

procedure TForm1.Button2Click(Sender: TObject);
var S2:String[4]; //Обратите внимание, что размер переменной, отведенной для чтения меньше размера переменной для записи.
begin
F:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'Какой-то файл', fmOpenRead);
F.Seek(0,soFromBeginning);
F.Read(S2,Sizeof(S2) );
F.Free;
T.Text := S2;
end;


Я думал, что допустим запишем в файл строку из 255 символов, а считаем меньшей по размеру переменной только первые 4.

Не тут то было. Получил каракули.

Если переменная для чтения равна по длине переменной для записи - все проходит как по маслу...




Автор: Amphiluke 9.7.2010, 18:43
А вы помните, что символ с индексом 0 содержит длину строки?
Вот вы читаете кусок строки, а нулевой символ этой строки неизменно остается равным длине исходной строки. Попробуйте:
Код

procedure TForm1.Button2Click(Sender: TObject);
var S2:String[4];
begin
F:= TfileStream.Create(ExtractFilePath(Application.ExeName)+'Какой-то файл', fmOpenRead);
F.Seek(0,soFromBeginning);
F.Read(S2,Sizeof(S2) );
S2[0] := #4; // <---
F.Free;
T.Text := S2;
end;

Автор: PsiMagistr 9.7.2010, 18:48
т.е. Идет попытка считывания 0 символа?

Я признаться не совсем понял.

Автор: Amphiluke 9.7.2010, 18:55
Ну, вы сначала пишете в файл, допустим, строку 'qwerty'. Записывается 7 байтов, из которых первый (нулевой) — #6.
Затем прочитываете строку типа string[4]. Ее размер — 5. Нулевой символ строки устанавливается в #6, что не соответствует изначальному #4. Отсюда лишние каракули в хвосте.

Автор: PsiMagistr 9.7.2010, 19:07

Amphiluke, БЛИН, не ну какой  дуб, однако. СПАСИБО Большое. 

Тупею от жары, чисто тупею.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)