Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

От чего идет подвисание программы? Работаю с большой строкой


Страницы:   1 2

cukerMAN ©   (2009-11-20 17:07:00) 

Вот пример кода, это я формирую запросы в БД в виде текстового файла что бы потом на сайте импортировать. Обьем в стринге предположительно пару десятков гигов и где то в этом месте идет подвисание:

res.Text:=s+res.Text;
s:=res.Text;
Delete(s,length(s)-2,1);
res.Text:=s+';';
res.SaveToFile(extractfilepath(paramstr(0))+'DB.txt');

Что посоветуете сделать?


Демо   (2009-11-24 21:23:00) [1]


> в Write нужно передавать переменную, а не свойство.


Главное передать корректно:

fs.Write(res.Text[1],...


Anatoly Podgoretsky   (2009-11-24 20:23:00) [2]

> RWolf  (24.11.2009 17:36:28)  [28]

Можно предположить, что с UTF-16 не придется столкнуть, поскольку последствия могут быть катастрофическими, в первую очередь по определению длины строки.


RWolf   (2009-11-24 17:39:00) [3]


> cukerMAN   (24.11.09 16:32) [22]
> Еще вопрос, а почему вот здесь:fs.Write(res.Text,Length(res.
> Text));вылетает ошибка [Error] Unit1.pas(270): Variable
> requiredКакой переменной не хватает ему?

в Write нужно передавать переменную, а не свойство.
s:=res.Text;
fs.Write(s,...);


RWolf   (2009-11-24 17:36:00) [4]


> Anatoly Podgoretsky ©   (24.11.09 16:50) [27]

ясно, будем знать (я пока что с новшествами 2010 знаком понаслышке).


Anatoly Podgoretsky   (2009-11-24 16:50:00) [5]

> RWolf  (24.11.2009 16:41:25)  [25]

Конечно тип char - производный тип. По ангельски Generic


Anatoly Podgoretsky   (2009-11-24 16:49:00) [6]

> sniknik  (24.11.2009 16:37:24)  [24]

Я не ошибся когда писал, это ucs-2 с фиксированой строкой, а UTF-16 много байтный, может и четыре байта быть, поэтому и называется UTF, поддерживает 2^20 символов, а не 2^16


RWolf   (2009-11-24 16:41:00) [7]


> Anatoly Podgoretsky ©   (24.11.09 16:35) [23]

размер типаChar, конечно.


sniknik   (2009-11-24 16:37:00) [8]

> Я бы не рискнул так утверждать для UTF-16
хотел сказать utf-8? т.к. 16 это юникод с фиксированной длинной char... вроде бы. :)


Anatoly Podgoretsky   (2009-11-24 16:35:00) [9]

> RWolf  (24.11.2009 16:16:17)  [17]

Я бы не рискнул так утверждать для UTF-16


cukerMAN   (2009-11-24 16:32:00) [10]

Еще вопрос, а почему вот здесь:
fs.Write(res.Text,Length(res.Text));

вылетает ошибка [Error] Unit1.pas(270): Variable required

Какой переменной не хватает ему?


RWolf   (2009-11-24 16:22:00) [11]


> То есть можно сделать s1[3] и будет копировать с третьего
> символа но тогда надо Length(s1)-2 верно?

да, именно так, с поправкой на размер Char.


cukerMAN   (2009-11-24 16:19:00) [12]

Спасибо большое, разобрался, все работает.


sniknik   (2009-11-24 16:16:00) [13]

>> s.Write(s1[1],Length(s1))
> Не понял ... Write может записать только один символ? Тогда зачем ему размер узнавать если у одного символа размер будет всегда равен 1??
показана запись строки... просто за начальный адрес указан первый элемент. в данном случае эквивалентом будет
s.Write(PChar(s1),Length(s1))
раз тебя цифры смущают...


cukerMAN   (2009-11-24 16:16:00) [14]


> s.Write(s1[1],Length(s1))


Спасибо, сделал как вы советовали и заработало! Я так понял буфер это начало откуда копировать ... То есть s1[1] говорится что копировать нужно с 1 символа. То есть можно сделать s1[3] и будет копировать с третьего символа но тогда надо Length(s1)-2 верно?


RWolf   (2009-11-24 16:16:00) [15]


> Тогда зачем ему размер узнавать если у одного символа размер
> будет всегда равен 1??

в современных версиях Delphi размер Char — два байта.


RWolf   (2009-11-24 16:14:00) [16]


> Не понял ... Write может записать только один символ?

нет, предложенная конструкция запишет всю строку, начиная с 1-го символа.


cukerMAN   (2009-11-24 16:11:00) [17]


> s.Write(s1[1],Length(s1))


Не понял ... Write может записать только один символ? Тогда зачем ему размер узнавать если у одного символа размер будет всегда равен 1??

И что теперь что бы записать строку то нужно делать так?

for i:=0 to lentgh(s1) do
begin
 s.Write(s1[i],1)
end;

Или я туплю? Как стринг записать?


RWolf   (2009-11-24 16:07:00) [18]

для юникодных дельфей — Length(s1) умножаем на SizeOf(Char).


RWolf   (2009-11-24 16:06:00) [19]

s.Write(s1[1],Length(s1))


cukerMAN   (2009-11-24 16:04:00) [20]

Сел изучать ТфаилСтрим и сразу же столкнулся с проблемой, подскажите почему такой простой пример и не работает?? Фаил создается но туда записывается какая то белеберда типа "ЬЩD " - это то что в файл записывается

procedure TForm1.Button1Click(Sender: TObject);
var s:TFileStream;s1:string;
begin
 s:=TFileStream.Create('C:/sssssss.txt', fmCreate);
 s1:='Hello test';
 s.Seek(0, soFromEnd);
 //showmessage(inttostr(SizeOf(s1)));
 s.Write(s1,SizeOf(s1));
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо