Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: stalker, Ekz 
Форум » Все о Delphi » Начинающим » Поиск и замена в файле
Поиск и замена в файле
NoxterДата: Четверг, 18.03.2010, 04:44 | Сообщение # 1
Ранг 1
Группа: Проверенные
Сообщений: 6
Награды: 0
Репутация: 0
Статус: Offline
Всем привет)
Вот мой TXT файл
Code
"Configs"
{
       "Games"
       {
        "Mod"
        {
         "GameDir"  ".\mod"
         "hammer"
         {
          "TextureForm at"  "5"   
          " MapForm at"  "4"
          " Def aultTextureScale"  "0.250000"
          "DefaultLightmapScale"  "16"
          "DefaultSolidEntity"  "func_detail"
          "GameExeDir"  " D:\ hal f-l ife  2"
          "MapDir"  ".\sourcesdk_content\mod\mapsrc"
          "CordonTexture"  "tools\toolsskybox"
          "MaterialExcludeCount"   " 0"
          "  Game Exe"   "D:\half-life 2\hl2.exe"
          "BSP"  "D:\SourceSDK\Bin\orangebox\bin\vbsp.exe"
          "Vis"  "D:\SourceSDK\Bin\orangebox\bin\vvis.exe"
          " Lig ht"   " D:\ Sou rceSDK\Bin\orangebox\bin\vrad.exe"
          "BSPDir"  ".\mod\maps"
          "GameData0"  "D:\SourceSDK\Bin\orangebox\bin\base.fgd"
         }    
        }      
       }      
       " SDKVersion"  "3"
}

Мне нужно заменить все символы .\ на D:\SDK.
Кто мне подскажет?

Да и еще есть код:

Code
procedure TForm1.Button1Click(Sender: TObject);
var       
        f: file;       
        l: Longint;       
        FileName, oldstring, newstring, s: string;       
begin       
        oldstring := '.\';
        newstring := 'D:\SourceSDK\';
        FileName  := 'C:\GameConfig.txt';
               
        s := oldstring;       
        AssignFile(f, FileName);       
        Reset(f, 1);       
        for l := 0 to FileSize(f) - Length(oldstring) - 1 do
        begin
          Application.ProcessMessages;
          Seek(f, l);       
          BlockRead(f, oldstring[1], Length(oldstring));       
          if oldstring = s then       
          begin
            Seek(f, l);       
            BlockWrite(f, newstring[1], Length(newstring));       
            //ShowMessage('String successfully replaced!');       
          end;       
          Application.ProcessMessages;       
        end;       
        CloseFile(f);       
end;

Но после нажатия кнопки в файле перезаписывается не только .\ но и следующий символ, и выходит такая фигня D:\SDK\od а не D:\SDK\Mod
Заранее спасибо!


Сообщение отредактировал Noxter - Четверг, 18.03.2010, 04:48
 
AdminДата: Четверг, 18.03.2010, 10:58 | Сообщение # 2
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Ну проблема в том, что BlockWrite пишет поверх уже имеющихся символов.
Я бы решил задачу так: сначала считал всю информацию из файла в переменную, затем заменил нужные символы. И перезаписал файл с новой информацией.
PS. В строку можно вставить подстроку процедурой insert()


Не оказываю помощь через личные сообщения и ICQ
 
ZuByДата: Четверг, 18.03.2010, 14:28 | Сообщение # 3
Ранг 5
Группа: Проверенные
Сообщений: 118
Награды: 2
Репутация: 2
Статус: Offline
я бы заменял символы через StringReplace.

http://www.zubymplayer.com
 
NoxterДата: Пятница, 19.03.2010, 02:37 | Сообщение # 4
Ранг 1
Группа: Проверенные
Сообщений: 6
Награды: 0
Репутация: 0
Статус: Offline
ZuBy, Ты мне код подробнее можешь расписать, и объяснить?
 
ZuByДата: Суббота, 20.03.2010, 12:54 | Сообщение # 5
Ранг 5
Группа: Проверенные
Сообщений: 118
Награды: 2
Репутация: 2
Статус: Offline
а что тут объяснять?
первое:
Quote (Admin)
Я бы решил задачу так: сначала считал всю информацию из файла в переменную, затем заменил нужные символы. И перезаписал файл с новой информацией

второе:
Quote (ZuBy)
я бы заменял символы через StringReplace.

вот и все.


http://www.zubymplayer.com
 
NoxterДата: Суббота, 20.03.2010, 14:21 | Сообщение # 6
Ранг 1
Группа: Проверенные
Сообщений: 6
Награды: 0
Репутация: 0
Статус: Offline
ZuBy, Да на словах я и сам это знаю а как это кодом написать?
Я по-моему в раздел для начинающих написал, а ты мне догадками отвечаешь.

Admin, Поможешь?

 
XakerДата: Суббота, 20.03.2010, 15:00 | Сообщение # 7
Ранг 4
Группа: Проверенные
Сообщений: 83
Награды: 1
Репутация: 0
Статус: Offline
Code
for l := 0 to FileSize(f) - Length(oldstring) - 1 do   
          begin   
       StringReplace(s, '.\', ' D:\SDK\Mod',[rfReplaceAll, rfIgnoreCase]);
            end;  

может я и не прав, не тестил...

Сообщение отредактировал Xaker - Суббота, 20.03.2010, 15:00
 
AdminДата: Суббота, 20.03.2010, 17:40 | Сообщение # 8
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Описание функции StringReplace

Ну когда мне нужно было выполнить подобную операцию (правда мне нужно было сохранить старую и новую версии файла) я делал примерно так:

Code
Assign(f1,'1.txt');
Assign(f2,'2.txt');
reset(f1);
rewrite(f2);

while not eof(f) do
begin
Readln(f1,s); // читаем строку
// тут изменяем строку нужным образом. Я тупо использовал pos
Writeln(f2,s); // пишем в новый файл
end;

closeFile(f1);
closeFile(f2);


Не оказываю помощь через личные сообщения и ICQ
 
NoxterДата: Вторник, 25.05.2010, 00:59 | Сообщение # 9
Ранг 1
Группа: Проверенные
Сообщений: 6
Награды: 0
Репутация: 0
Статус: Offline
Всем привет)
Скажите а как заменить строку .\ на %sourcesdk%\
Где %sourcesdk% - это путь к папке D:\SourceSDK\ который берется из реестра
HKEY_CURRENT_USER\Environment
Смотрите скрин:



Сообщение отредактировал Noxter - Вторник, 25.05.2010, 01:01
 
skycarДата: Вторник, 25.05.2010, 03:34 | Сообщение # 10
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Заменить строку? Простейшее решение - пробегать её в цикле, сверять с фрагментом и заменять
Code

var I: Integer;
  S: string;
...
begin
for I:=1 to Length(S) do //пробегаем строку
   if Copy(S, I, 2) = '.\' then  //если найден фрагмент...
  begin
    Delete(S, I, 2); // он будет удалён...
  Insert(S, '%sourcesdk%\', I); // ... и заменён
  end;
end;

Попробуй
 
Форум » Все о Delphi » Начинающим » Поиск и замена в файле
Страница 1 из 11
Поиск:

Copyright DelphiDevelop.ru © 2008-2018
Хостинг от uCoz