Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с файлами


Страницы:   1 2

unknowing ©   (2006-02-02 08:20:00) 

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


unknowing   (2006-02-02 10:24:00) [1]

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


wal   (2006-02-02 10:11:00) [2]


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

С уважением.


Fay   (2006-02-02 10:08:00) [3]

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


unknowing   (2006-02-02 10:03:00) [4]


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

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


Fay   (2006-02-02 09:53:00) [5]

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 09:39:00) [6]


> 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]


unknowing   (2006-02-02 09:35:00) [7]


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

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


Fay   (2006-02-02 09:33:00) [8]

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

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

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


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

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

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


Digitman   (2006-02-02 09:29:00) [10]


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


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


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


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

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


Ega23   (2006-02-02 09:28:00) [12]


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;


unknowing   (2006-02-02 09:26:00) [13]


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

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


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


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

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

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


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

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


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


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


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

1.5 мБ.


Ega23   (2006-02-02 09:19:00) [17]

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


Fay   (2006-02-02 09:18:00) [18]

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;


unknowing   (2006-02-02 09:17:00) [19]


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

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


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

Пытаемся развить идею [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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо