Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

Работа с файлами   Найти похожие ветки 

 
unknowing ©   (2006-02-02 08:20) [0]

Доброго времени суток! Вопрос такой: есть файл (текстовый) который содержит символы "-". Необходимо все "-" заменить на какой-нибудь другой(например, на "!").


 
EvS   (2006-02-02 08:38) [1]

И в чём проблема?


 
КиТаЯц ©   (2006-02-02 08:47) [2]

function StringReplaceAll (Text, Chto, Chem: string): string; //где менять, что менять, чем менять
 var IsPos : integer;
begin
 while pos(Chto, Text) > 0 do begin
   IsPos := pos(Chto, text);
   delete (Text, IsPos, length(Chto));
   insert (Chem, Text, IsPos);
 end;
result := Text;
end;


 
КаПиБаРа ©   (2006-02-02 08:50) [3]

F1 - TStringList, TStringList.LoadFromFile, TStringList.SaveToFile, Pos, Pos Example


 
unknowing ©   (2006-02-02 08:51) [4]


> КиТаЯц ©   (02.02.06 08:47) [2]

Спасибо. Но я пробывал через стандартную процедуру ReplaceString, в качестве параметра которой передается строка и все зависло... Файл очень большого размера.


 
unknowing ©   (2006-02-02 08:53) [5]


> КаПиБаРа ©   (02.02.06 08:50) [3]

Вот именно про этот класс я и использовал. См.
> unknowing ©   (02.02.06 08:51) [4]


 
Loginov Dmitry ©   (2006-02-02 08:53) [6]

Вот самый простой способ:

procedure TForm1.Button1Click(Sender: TObject);
var
 F: File of Byte;
 C, Simbol: Byte;
begin
 Simbol := Ord("!");
 AssignFile(F, "s.s");
 Reset(F);
 while not Eof(F) do
 begin
   Read(F, C);
   if C = Ord("+") then
   begin
     Seek(F, FilePos(F) - 1);
     Write(F, Simbol);
   end;
 end;
 CloseFile(F);
end;


Код не самый быстрый .............
:)


 
ZeroDivide ©   (2006-02-02 08:55) [7]

var
//TStringList - самый подходящий класс для этих целей
 SL: TStringList;
begin
// Создаем экземпляр этого класса
 SL := TStringList.Create;
// Заружаем файл в SL
 SL.LoadFromFile("YourFileName.txt");
//Меняем символ в тексте
 SL.Text := AnsiReplaceStr(SL.Text, "-", "!");
//Сохраняем файл
 SL.SaveToFile("YourFileName.txt");
// Убиваем объект
 SL.Free;
end;


 
unknowing ©   (2006-02-02 08:56) [8]


> Код не самый быстрый .............
> :)

Спасибо! Но,


 
unknowing ©   (2006-02-02 08:56) [9]


> Код не самый быстрый .............
> :)

Спасибо! Но,
> Код не самый быстрый .............
, критично.


 
КиТаЯц ©   (2006-02-02 08:57) [10]


> unknowing ©   (02.02.06 08:51) [4]
> ...
> .. Файл очень большого размера.


Считывай - меняй - сохраняй построчно.


 
unknowing ©   (2006-02-02 08:58) [11]


> ZeroDivide ©   (02.02.06 08:55) [7]

См.
> unknowing ©   (02.02.06 08:53) [5]

Не работает с большими файлами или... (Стою на асфальте в лыжи обутый, то ли лыжи не едут, то ли я еб..тый:)


 
КиТаЯц ©   (2006-02-02 09:07) [12]

Пытаемся развить идею [7] (сочиняю на ходу - возможны ошибки)

var InFile: textfile;
   List: tStringlist;
   S: string
   i: integer;
begin
 List:= tstringlist.Create;
 try
   assignfile (InFile, "Text.txt");
   reset (InFile);
   while not EOF(InFile) do begin
     readln (InFile, S);
     S:= StringReplaceAll(S, "-","!");
     List.Add(S);
   end;
   CloseFile(InFile);
   List.SaveToFile("Text.txt");
 except
   CloseFile(InFile);
   FreeAndNil(List);
 end;
end;


 
unknowing ©   (2006-02-02 09:17) [13]


> КиТаЯц ©   (02.02.06 09:07) [12]

У меня все один в один! Не работает!!! Я уже не знаю что и делать... На низком уровне Read, Write очень медленно...


 
Fay ©   (2006-02-02 09:18) [14]

const
 BUFSIZE = 4096;
 FILE_NAME = "x:\file name.ext";
var
 hFile : THandle;
 n, nr, nw : DWORD;
 Buffer : array[0..BUFSIZE - 1] of AnsiChar;
label
 EOL;
begin
 hFile := CreateFileA(FILE_NAME, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
 if hFile = INVALID_HANDLE_VALUE then
   RaiseLastOSError;
 try
   goto EOL;
   repeat
     for n := 0 to nr - 1 do
       if Buffer[n] = "-" then
         Buffer[n] := "!";
     SetFilePointer(hFile, -nr, nil, FILE_CURRENT);
     WriteFile(hFile, Buffer, nr, nw, nil);
     EOL :
     ReadFile(hFile, Buffer, BUFSIZE, nr, nil);
   until nr = 0;
   FlushFileBuffers(hFile);
 finally
   CloseHandle(hFile);
 end;


 
Ega23 ©   (2006-02-02 09:19) [15]

Насколько большой размер файла?


 
unknowing ©   (2006-02-02 09:21) [16]


> Ega23 ©   (02.02.06 09:19) [15]

1.5 мБ.


 
КаПиБаРа ©   (2006-02-02 09:24) [17]

unknowing ©   (02.02.06 8:58) [11]
Не работает с большими файлами или...


"Не работает" это что значит?


 
КиТаЯц ©   (2006-02-02 09:25) [18]


> unknowing ©   (02.02.06 09:17) [13]

Тэкс... Тут в "прочие" вчера тему поднимали про то, что "надо де вежливее с новичками"...

ЧТО НЕ РАБОТЕТ?!!!


 
unknowing ©   (2006-02-02 09:26) [19]


> КаПиБаРа ©   (02.02.06 09:24) [17]

Это значит, что после подобного вызова этой функции у меня наглухо зависла сама программа, а потом и ОС.


 
Ega23 ©   (2006-02-02 09:28) [20]


function ReplaceChar(const CharIn, CharOut : Char; const FileName:String):Boolean;
var
List:TStringList
i:Integer;
begin
Result:=True;
List:=TStringLis.Create;
try
  try
    List.LoadFromFile(FileName);
    for i:=0 to List.Count-1 do
        List.Strings[i]:= StringReplaceAll(List.Strings[i], CharIn, CharOut);
    List.SaveToFile(FileName);
  except
    Result:=False;
  end;
 
finally
  List.Free;
end;
end;


 
КиТаЯц ©   (2006-02-02 09:28) [21]


> unknowing ©   (02.02.06 09:26) [19]
>
>
> > КаПиБаРа ©   (02.02.06 09:24) [17]
>
> Это значит, что после подобного вызова этой функции у меня
> наглухо зависла сама программа, а потом и ОС.

1. Какой?
2. Код в студию щеликом пожалуйста. Спасибо.


 
Digitman ©   (2006-02-02 09:29) [22]


> unknowing ©   (02.02.06 09:21) [16]


Используя OpenFile + CreateFileMapping + MapViewOfFile отображаешь свой файл в ВАП своего процесса, при этом ты получаешь нач.адрес месторазмещения образа файла. Зная этот адрес и полный размер файла работаешь с образом как с обычным массивом байт, в цикле находя эл-ты массива с искомым значением и заменяя на требуемые.


 
КаПиБаРа ©   (2006-02-02 09:30) [23]

unknowing ©   (02.02.06 9:26) [19]
Нужно отлаживать программу.

Запусти программу из Delphi поставь точки останова или через каждые 100-1000 строк ShowMessage(С номером строки). Определи причину зависания.


 
Fay ©   (2006-02-02 09:33) [24]

2 unknowing
> Файл очень большого размера.
> 1.5 мБ.

Это и есть большой файл?! LOL 8)

Смотри внимательно ответ [22]


 
unknowing ©   (2006-02-02 09:35) [25]


> Ega23 ©   (02.02.06 09:28) [20]

Большое спасибо! Действительно быстрее чем read,write!!


 
unknowing ©   (2006-02-02 09:39) [26]


> Fay ©   (02.02.06 09:33) [24]


> Digitman ©   (02.02.06 09:29) [22]

Спасибо за отзыв! Но я, как бы новичок и, если честно, до файлов отображенных в память еще не дошел:)

> Это и есть большой файл?! LOL 8)

Имеется в виду, что строка содержащая такое кол-во символом тяжела для
replaceString(text,..). Или см.
> unknowing ©   (02.02.06 08:58) [11]


 
Fay ©   (2006-02-02 09:53) [27]

2 unknowing ©   (02.02.06 09:39) [26]
> если честно, до файлов отображенных в память еще не дошел:)


var
 hFile, hFileMapping : THandle;
 pView : PAnsiChar;
 n, dwFileSize : DWORD;
label
 EOL;
begin
 hFile := CreateFileA(PChar("x:\file name.ext"), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
 if hFile = INVALID_HANDLE_VALUE then
   RaiseLastOSError;
 try
   dwFileSize := GetFileSize(hFile, nil);
   if dwFileSize = 0 then
     Exit;
   hFileMapping := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, dwFileSize, nil);
   pView := MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
   for n := 0 to dwFileSize - 1 do
     if pView[n] = "-" then
       pView[n] := "!";
   UnmapViewOfFile(pView);
   CloseHandle(hFileMapping);
   FlushFileBuffers(hFile);
 finally
   CloseHandle(hFile);
 end;


 
unknowing ©   (2006-02-02 10:03) [28]


> Fay ©   (02.02.06 09:53) [27]

Здорово, спасибо! А можно простыми терминами объяснить что есть отображение и когда его применять?


 
Fay ©   (2006-02-02 10:08) [29]

Можно. На сайте есть статья.


 
wal ©   (2006-02-02 10:11) [30]


> А можно простыми терминами объяснить что есть отображение
> и когда его применять?
Отображение, это когда файл, расположенный на диске "проецируется" в адресное пространство твоего приложения (или нескольких приложений). При этом работая с памятью не нужно заботиться об операциях чтения-записи - этим занимается система. В конце концов она денег стоит, пусть отрабатывает.
Применять можно при твоей задаче, или схожей.
Так же можно применять для обмена данными между разними процессами, когда файл отображен в адресное пространство нескольких процессов. При этом можно новый файл не создавать, а использовать файл подкачки.

С уважением.


 
unknowing ©   (2006-02-02 10:24) [31]

Вопрос исчерпан. Направление движения ясно :)
Огромное спабибо откликнувшимся!!!



Страницы: 1 вся ветка

Текущий архив: 2006.02.19;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.034 c
1-1137519687
студент России
2006-01-17 20:41
2006.02.19
помогите голодному студенту !


2-1139037209
John_Doe
2006-02-04 10:13
2006.02.19
Считывание значений из Table в Combobox


15-1138561822
Kerk
2006-01-29 22:10
2006.02.19
"Google скрывает данные о порнографии в Интернете"


2-1138922506
promomix
2006-02-03 02:21
2006.02.19
Глюк ord на символе 26.


2-1138884273
Silver__Dragon
2006-02-02 15:44
2006.02.19
HotKey