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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить первые 10 символов из строки 
:(
    Опции темы
RinOS
Дата 11.9.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте у меня вопрос нужно открыть файл и на 7 стороке в начале добавить слово при этом чтобы оставшаяся запись не изменилась. И как удалить первые 10 символов из строки.
PM MAIL   Вверх
Yanis
Дата 11.9.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

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



RinOS
А ты TStringList пробовал? Там всё есть, что тебе нужно. Вот так например добавить строку:
Код
var
  sl:TStringList;
begin
  sl := TStringList.Create;

  sl.LoadFromFile('');
  sl.Insert(6, 'строка для вставки');

  FreeAndNil(sl);
end;


А вот удалить сразу из строки несколько символов не получится, но можно сделать так:
Код
// "удалить" первые 10 символов первой строки
sl.Strings[0] := Copy(sl.Strings[0], 10 + 1, Length(sl.Strings[0]) - 10);


Это сообщение отредактировал(а) Yanis - 11.9.2006, 18:00


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Coder
Дата 12.9.2006, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А вот удалить сразу из строки несколько символов не получится, но можно сделать так:

а как же стандартная паскалевская пароцедура delete();
PM MAIL   Вверх
Alexeis
Дата 12.9.2006, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Coder @  12.9.2006,  00:04 Найти цитируемый пост)
а как же стандартная паскалевская пароцедура delete(); 

Работает прекрасно, просто Yanis, про нее забыл smile , правда в том виде в котором она применялась в паскале тут не получится применить. Только так
Код

var
  s : ansistring;
begin
..........
s := sl.Strings[0];
delete(s, 1, 10);
sl.Strings[0] := s;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Yanis
Дата 12.9.2006, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

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



Цитата(Coder @  12.9.2006,  01:04 Найти цитируемый пост)
а как же стандартная паскалевская пароцедура delete(); 

Её нельзя применить к property.

Цитата(alexeis1 @  12.9.2006,  01:22 Найти цитируемый пост)
Работает прекрасно, просто Yanis, про нее забыл

Если бы smile 

Сказав, что 
Цитата(Yanis @  11.9.2006,  18:59 Найти цитируемый пост)
удалить сразу из строки несколько символов не получится

Я подразумевал, что нельзя применить delete к sl.strings[0]. Я думал, что это будет ясно из моих слов smile Но зато RinOS узнал ещё об одном способе удаления символов.

P. S. слово "сразу" читай как "непосредственно".

Это сообщение отредактировал(а) Yanis - 12.9.2006, 09:06


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 12.9.2006, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

sl.Strings[0] := string(PChar(sl.Strings[0])+ 10 );
 smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Yanis
Дата 12.9.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

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



Romikgy
Неплохо smile 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Matematik
Дата 12.9.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Romikgy @ 12.9.2006,  10:49)
Код

sl.Strings[0] := string(PChar(sl.Strings[0])+ 10 );
 smile

А что будет если строка меньше 10 символов?
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 12.9.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Romikgy, этот код только выглядит просто, внутренняя реализация будет не проще, а что касается наглядности и защиты от ошибок вообще кошмар. Правельно говрорит Matematik если речь пойдет о универсальном применении или надо будетнапример удалить не с первого, а с 3-го, что теперь код переписывать. Такие сомнительные трюки это плохой стиль программирования.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 12.9.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(Yanis @  11.9.2006,  16:59 Найти цитируемый пост)
sl.Strings[0] := Copy(sl.Strings[0], 10 + 1, Length(sl.Strings[0]) - 10);


Цитата(alexeis1 @  11.9.2006,  23:22 Найти цитируемый пост)
delete(s, 1, 10);

А здесь что будет если строка будет меньше 10 символов?
Цитата(alexeis1 @  12.9.2006,  11:40 Найти цитируемый пост)
внутренняя реализация будет не проще, а что касается наглядности и защиты от ошибок вообще кошмар

ну насчет внутреней реализации я бы не говорил , что она будет сложнее чем выше представленое!
про ошибки никто не спрашивал, а спросили см. сабж, я ответил , да еще ответил после 2 вариантов, не мной предложеных, и автор не определил , что надо делать если будет строка менее 10 символов!

Цитата(alexeis1 @  12.9.2006,  11:40 Найти цитируемый пост)
надо будетнапример удалить не с первого, а с 3-го, что теперь код переписывать

как была поставлена задача такой ответ я и дал, была бы фраза о том что с 3 символа , я бы вообще не писал!
Цитата(alexeis1 @  12.9.2006,  11:40 Найти цитируемый пост)
Такие сомнительные трюки это плохой стиль программирования.

В чем их сомнительность?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Teran
Дата 12.9.2006, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 590
Регистрация: 9.9.2005
Где: Украина, Запорожь е

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



Цитата(Romikgy @  12.9.2006,  12:58 Найти цитируемый пост)

Цитата(alexeis1 @  12.9.2006,  00:22 Найти цитируемый пост)
delete(s, 1, 10);

А здесь что будет если строка будет меньше 10 символов?

s=''  и никаких ошибок

Это сообщение отредактировал(а) Teran - 12.9.2006, 13:05


--------------------
Ни цего не понимаю
PM MAIL ICQ   Вверх
Romikgy
Дата 12.9.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



гуд тогда так
Код


if  (length(sl.Strings[0])>10) then 
sl.Strings[0] := string(PChar(sl.Strings[0])+ 10 );
else
sl.Strings[0]:='';

нормально ?

Это сообщение отредактировал(а) Romikgy - 12.9.2006, 13:15


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 12.9.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



По функции Copy
Цитата

If Index is larger than the length of S, Copy returns an empty string or array.

По функции delete
Цитата

If index is larger than the length of the string or less than 1, no characters are deleted.

If count specifies more characters than remain starting at the index, Delete removes the rest of the string. If count is less than or equal to 0, no characters are deleted.


Что произойдет при предложеном тобой варианте неизвестно, поскольку зависит от содержимого памяти после строки.

Цитата(Romikgy @  12.9.2006,  12:58 Найти цитируемый пост)
ну насчет внутреней реализации я бы не говорил , что она будет сложнее чем выше представленое!


У меня есть серьезные опасения, что после конвертирования строки в PChar, стандартный механизм управления памятью строк перестает работать и память 10 символов останется неосвобожденной, конвертироване назад в String, приведет к полному копированию всей строки в новую область памяти. Вот такая получается непростая реализация. 

На счет сомнительности надеюсь теперь понятно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 12.9.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

var
   sx: string;
begin
  sx:='Privet rtretertertetretete';
if  (length(sx)>10) then
sx := string(PChar(sx)+ 10 )
else
sx:='';
Edit1.Text:=sx;
end;
Код

00454F74 33C0             xor eax,eax
00454F76 55               push ebp
00454F77 68DF4F4500       push $00454fdf
00454F7C 64FF30           push dword ptr fs:[eax]
00454F7F 648920           mov fs:[eax],esp
Unit1.pas.98: sx:='Privet rtretertertetretete';
00454F82 8D45FC           lea eax,[ebp-$04]
00454F85 BAF44F4500       mov edx,$00454ff4
00454F8A E83DEFFAFF       call @LStrLAsg
Unit1.pas.99: if  (length(sx)>10) then
00454F8F 8B45FC           mov eax,[ebp-$04]
00454F92 E85DF1FAFF       call @LStrLen
00454F97 83F80A           cmp eax,$0a
00454F9A 7E17             jle +$17
Unit1.pas.100: sx := string(PChar(sx)+ 10 )
00454F9C 8B45FC           mov eax,[ebp-$04]
00454F9F E850F3FAFF       call @LStrToPChar
00454FA4 8BD0             mov edx,eax
00454FA6 83C20A           add edx,$0a
00454FA9 8D45FC           lea eax,[ebp-$04]
00454FAC E87BF0FAFF       call @LStrFromPChar
00454FB1 EB08             jmp +$08
Unit1.pas.102: sx:='';
00454FB3 8D45FC           lea eax,[ebp-$04]
00454FB6 E879EEFAFF       call @LStrClr
Unit1.pas.103: Edit1.Text:=sx;
00454FBB 8B55FC           mov edx,[ebp-$04]
00454FBE 8B8308030000     mov eax,[ebx+$00000308]
00454FC4 E86FECFDFF       call TControl.SetText
00454FC9 33C0             xor eax,eax
00454FCB 5A               pop edx
00454FCC 59               pop ecx
00454FCD 59               pop ecx
00454FCE 648910           mov fs:[eax],edx
00454FD1 68E64F4500       push $00454fe6


Добавлено @ 13:19 
Цитата(alexeis1 @  12.9.2006,  12:09 Найти цитируемый пост)
стандартный механизм управления памятью строк перестает работать

работает smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 12.9.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



ну и где освобождение памяти 10 элементов?

Это сообщение отредактировал(а) alexeis1 - 12.9.2006, 13:25


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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