Форум: "Начинающим";
Текущий архив: 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.046 c