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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки и файлы 
:(
    Опции темы
PsiMagistr
Дата 9.7.2010, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ребята, если вам не сложно обясните мне следующую вещь.

Записываю строку в файл через 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.

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

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





Это сообщение отредактировал(а) PsiMagistr - 9.7.2010, 18:01


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Amphiluke
Дата 9.7.2010, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

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



А вы помните, что символ с индексом 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;

PM   Вверх
PsiMagistr
Дата 9.7.2010, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



т.е. Идет попытка считывания 0 символа?

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

Это сообщение отредактировал(а) PsiMagistr - 9.7.2010, 18:50


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Amphiluke
Дата 9.7.2010, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

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



Ну, вы сначала пишете в файл, допустим, строку 'qwerty'. Записывается 7 байтов, из которых первый (нулевой) — #6.
Затем прочитываете строку типа string[4]. Ее размер — 5. Нулевой символ строки устанавливается в #6, что не соответствует изначальному #4. Отсюда лишние каракули в хвосте.
PM   Вверх
PsiMagistr
Дата 9.7.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




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

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


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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