![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
От чего идет подвисание программы? Работаю с большой строкой
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;