Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2017, 20:14   #1
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию Проблема с файлом, проецируемым в память (Delphi)

Добрый день,

Техническое задание
С помощью механизма проецирования в память запишите в обратном порядке содержимое текстового файла.

Смысл моего алгоритма в следующем:
1. Создаю объект ядра "Файл";
2. Считываю размер о.я. "Файл" в переменную Size.
3. Создаю объект ядра "файл, проецируемый в память"
4. Проецирую файловые данные на адресное пространство процесса
5. Далее считываю содержимое файла (pFile) в строку Str.
6. С помощью функции ReverseString переворачиваю строку Str и заношу её в переменную buff.
7. Для промежуточной проверки вывожу buff в поле Edit1.Text
8. Преобразовываю строку buff в PChar и пытаюсь "перезаписать" её в текстовый файл pFile.

Проблема заключается в том, что после выполнения пункта 8 содержимое файла не меняется. Может кто подскажет в чём проблема ? Так как первый раз работаю с функциями проецирования в память.

Быть может кто-то может подсказать как сделать правильно ?

Заранее спасибо!

Мой код:

Переменные
Код:
var
  Form1: TForm1;
  hFile,hFileMap:THandle; pFile:PChar; Str,buff:string; i,Size:Integer;
Основная программа:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Str := ''; buff := '';
// Пункт 1
  hFile := CreateFile('D:\1.txt', GENERIC_READ OR GENERIC_WRITE, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hFile = INVALID_HANDLE_VALUE then
    begin
      ShowMessageFmt('Ошибка %d при создании файла',[GetLastError]);
      exit;
    end;
//Пункт 2
  Size := GetFileSize(hFile,nil);  
//Пункт 3
  hFileMap := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, Size, nil);
  if hFileMap = INVALID_HANDLE_VALUE then
    begin
      ShowMessageFmt('Ошибка %d при создании объекта "файл, проецируемый в память"', [GetLastError]);
      CloseHandle(hFile);
      exit;
    end;
//Пункт 4
  pFile := MapViewOfFile(hFileMap, FILE_MAP_WRITE,0,0,0);
  if pFile =  nil then
    begin
      ShowMessageFmt('Ошибка %d при проецировании в память',[GetLastError]);
      CloseHandle(hFile); CloseHandle(hFileMap); exit;
    end;
  pFile[GetFileSize(hFile,nil)] := #0;

  i:=0;
//Пункт 5
  Str:= string(pFile);

//Пункт 6
  buff:= ReverseString(Str);

//Пункт 7
  Edit1.Text := buff;

//Пункт 8
  pFile := PChar(buff);


  UnMapViewOfFile(pFile);
  CloseHandle(hFile); CloseHandle(hFileMap);

end;
artems67 вне форума Ответить с цитированием
Старый 16.10.2017, 20:41   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Так вы ничего не пишите в файл. Вы только один указатель присвоили другому.
p51x вне форума Ответить с цитированием
Старый 16.10.2017, 22:55   #3
artems67
Пользователь
 
Регистрация: 17.11.2015
Сообщений: 62
По умолчанию

Добавил переменную - указатель на элементы строки buff:string
Код:
pbuff:PChar;
Изменил 8 пункт
Код:
  for i:=1 to Length(buff) do
        begin
          pbuff := Addr(buff[i]);
          pFile[i-1] := pbuff^;
        end;
Теперь в файл строчка записывается нормально. Но если файл состоит из нескольких строк, то после инвертирования содержимого текстового файла они превращаются в одну

Пример

Исходный файл:
bsb asdsd dsbsa
mama papa 332

Измененный файл:

233 apap amamasbsd dsdsa bsb

Не придумал как это предусмотреть.
artems67 вне форума Ответить с цитированием
Старый 16.10.2017, 23:06   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

pFile - это указатель. При маппинге файл считывается в некоторый буфер, а указатель pFile устанавливается на этот буфер. Далее Вы на основе этого буфера создаёте строку, производите с ней некоторые манимуляции, получаете PChar от нее и присваиваете указателю pFile. Но ведь это не приводит к копированию информации в буфер маппинга. Надо вместо этого использовать CopyMemory

Не успел..

Последний раз редактировалось Black Fregat; 16.10.2017 в 23:06. Причина: Не успел..
Black Fregat вне форума Ответить с цитированием
Старый 16.10.2017, 23:08   #5
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от artems67 Посмотреть сообщение
они превращаются в одну
Дело в том, что под Windows символ конца строки состоит из двух символов.
Тут два выхода - либо обрабатывать буфер не весь, а по строкам, либо в результате инвертировать эти символы
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с файлом sokov.timofej Microsoft Office Access 3 06.09.2017 14:43
Проблема с файлом БД xxx1994 Помощь студентам 1 25.05.2012 19:32
Проблема с файлом Владимир 123 Microsoft Office Excel 16 12.12.2010 13:14
Проблема с файлом optimator Помощь студентам 7 12.11.2010 23:22
Проблема с файлом!!! Styks007 Операционные системы общие вопросы 4 26.09.2010 16:15