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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема со Stream, чтение строк из файла 
V
    Опции темы
Burka
Дата 9.8.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Идея такая: записывать в файл через потоки длинну строки, потом сому строку. А читать, соответственно, длинну а потом строку.
но вот этот код не работает, подскажите, где проблема?

Запись
Код

procedure TForm1.Button1Click(Sender: TObject);
var Stream :TFileStream;
    s:integer;
    s2:string;
begin
 Stream := TFileStream.Create('c:\va.txt', fmCreate);
 s2:=edit1.Text;
 s:=length(s2); 
 Stream.Write(s,sizeof(integer)); 
 Stream.Write(s2,s);
 stream.Free;
end;


Чтение
Код

procedure TForm1.Button2Click(Sender: TObject);
var Stream :TFileStream;
    s:integer;
    s2:string;
begin
 Stream := TFileStream.Create('c:\va.txt', fmOpenRead);
 stream.ReadBuffer(s,sizeof(integer));
 stream.ReadBuffer(s2,s);
 showMessage(s2)  ;
 stream.Free;
end;



--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Snowy
Дата 9.8.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Код

Stream.Write(s[1],sizeof(integer)); 
Код

  SetLength(s2, s);
  stream.ReadBuffer(s2[1],s);


Добавлено через 56 секунд
А ещё есть классы TWriter и TReader...
PM MAIL   Вверх
Burka
Дата 9.8.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я вот не понял, что это значит? если ссчитать что s:integer.
Код

Stream.Write(s[1],sizeof(integer)); 


SetLength(s2, s); - это хорошо) но предполагается что я не знаю длинны строки, когда читаю, то есть сначала ее тоже нужно прочитать из файла.

Добавлено через 14 минут и 54 секунды
Вот так работает. длинну еще на 1 приходитсмя увеличивать, а то он символа не дочитывает. 
Код

stream.ReadBuffer(s,sizeof(integer));
setlength(s2,s+1);
stream.ReadBuffer(s2,s);



--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Snowy
Дата 9.8.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



В первой перепутал - не ту строку поправил. Просто в моих программах обычно s - это string smile
Код

procedure TForm1.Button1Click(Sender: TObject);
var Stream :TFileStream;
    s:integer;
    s2:string;
begin
 Stream := TFileStream.Create('c:\va.txt', fmCreate);
 s2:=edit1.Text;
 s:=length(s2); 
 Stream.Write(s,sizeof(integer)); 
 Stream.Write(s2[1],s);
 stream.Free;
end;
А второй выглядит так:
Код

procedure TForm1.Button2Click(Sender: TObject);
var Stream :TFileStream;
    s:integer;
    s2:string;
begin
 Stream := TFileStream.Create('c:\va.txt', fmOpenRead);
 stream.ReadBuffer(s,sizeof(integer));
  SetLength(s2, s);
 stream.ReadBuffer(s2[1],s);
 showMessage(s2)  ;
 stream.Free;
end;

PM MAIL   Вверх
Burka
Дата 9.8.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ок, так тоже работает)
про S2[1] просто не думал даже) тперь буду знать.


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
PM MAIL   Вверх
Snowy
Дата 9.8.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(Burka @  9.8.2007,  11:45 Найти цитируемый пост)
ок, так тоже работает)
Не так тоже, а именно так и работает.
А вот так stream.ReadBuffer(s2,s); не работает.
А если работает, то только до перезапука программы. И некорректно.
Ибо ты не считываешь строку, а просто читаешь указатель.
В итоге у тебя s2 просто указывает на ту строку в памяти, которую ты до этого писал.
То есть не берёт её из файла, а ссылается на строку, которая уже сидит в памяти, ибо ты просто прочитал указатель на неё. А тебе нужно читать строку.

Цитата(Burka @  9.8.2007,  11:45 Найти цитируемый пост)
про S2[1] просто не думал даже) тперь буду знать.
Просто отдавать в Write/Read нужно блок памяти. А стринг по сути указатель на эту память.
Можно не s2[1], а по честному разыменовать указатель:
Код
    Stream.Write(pointer(s2)^, s);
Но s2[1] просто короче по записи, да и результат идентичен, т.к. по сути pointer(s2)^ как раз и указывает на s2[1].
PM MAIL   Вверх
Burka
Дата 9.8.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все ясно, Спасибо, что объеснил!


--------------------
Великие умы обсуждают идеи; средние умы обсуждают события; мелкие умы обсуждают людей.
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.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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