Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.045 c
8-1122035208
Wm.DIGGER
2005-07-22 16:26
2006.02.19
Как узнать название кодека по его тэгу :)


15-1138350445
syte_ser78
2006-01-27 11:27
2006.02.19
проблемы с украинской буквой І


15-1138388817
cyborg
2006-01-27 22:06
2006.02.19
Есть оказывается там люди


3-1135602457
Punch
2005-12-26 16:07
2006.02.19
Хочу быструю сортировку


3-1134919989
Express
2005-12-18 18:33
2006.02.19
Обязательное поле....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский