Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WriteFile: запись нескольких строк, используя, спецсимвол перехода на следующую строку 
:(
    Опции темы
malor
  Дата 23.6.2011, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Код
  temp := '1stroka' + '#13' + '2stroka';
  hFile:= CreateFile('D:\EventNew.txt', GENERIC_READ or GENERIC_WRITE,
          FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);
  WriteFile(hFile, temp[1], Length(temp), ByteWritten, 0);
  CloseHandle(hFile);

Результат в файле:
1 s t r o k a # 1

Переноса нет...

PS: Откуда пробелы между символами берутся?

Это сообщение отредактировал(а) malor - 23.6.2011, 21:40
PM MAIL   Вверх
Keeper89
Дата 23.6.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Какая Delphi и какой тип у temp?


--------------------
PM MAIL WWW   Вверх
malor
  Дата 23.6.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



temp: String;

Delphi XE
PM MAIL   Вверх
Keeper89
Дата 23.6.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Тогда
Код

WriteFile(hFile, PAnsiChar(temp)^, Length(temp), ByteWritten, nil);


Это сообщение отредактировал(а) Keeper89 - 23.6.2011, 21:52


--------------------
PM MAIL WWW   Вверх
malor
  Дата 23.6.2011, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Все равно вот так: 
1 s t r o k a # 1

Код
procedure TForm1.FormCreate(Sender: TObject);
var    hFile: THandle;
         ByteWritten: cardinal;
         temp: String;
begin
  temp := '1stroka' + '#13' + '2stroka';
  hFile:= CreateFile('D:\EventNew.txt', GENERIC_READ or GENERIC_WRITE,
          FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);
  WriteFile(hFile, PAnsiChar(temp)^, Length(temp), ByteWritten, nil);
  CloseHandle(hFile);

end;

PM MAIL   Вверх
THandle
Дата 23.6.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



Может что то такое?
Код


procedure TForm1.Button1Click(Sender: TObject);
var
  hFile: THandle;
  ByteWritten: Cardinal;
  temp: String;
begin
  temp := '1stroka' + #13#10 + '2stroka';
  hFile:= CreateFile('F:\EventNew.txt', GENERIC_READ or GENERIC_WRITE,
          FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);
  WriteFile(hFile, temp[1], Length(temp) * SizeOf(Char), ByteWritten, nil);
  CloseHandle(hFile);
end;

PM   Вверх
malor
  Дата 23.6.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Так заработало, но это становится заметным если Блокнот по F4 открываешь, а если по F3, то нет. Нажатие "Переносить строки" в менюхе Блокнота никак не влияет?

[*] Почему пробелы между буквами?
PM MAIL   Вверх
kami
Дата 24.6.2011, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



сперва - записать в файл префикс, который позволит текстовому редактору понять, что нужно работать с UTF16:
Код

const
  UnicodePrefix:Word = $FEFF;
begin
  ....
  WriteFile(hFile, UnicodePrefix, SizeOf(Word), ByteWritten, nil); 
  // это делается 1 раз - при создании или обнулении размера файла
  // и уже потом - писать всё остальное:
  WriteFile(hFile, temp[1], Length(temp) * SizeOf(Char), ByteWritten, nil);
...
end;


Если не записать префикс, то текстовые редакторы будут думать, что работают либо с ANSI либо с UTF8. Что для DelphiXE - неверно. Отсюда и "пробелы" между буквами - второй байт символа в UTF16

Это сообщение отредактировал(а) kami - 24.6.2011, 00:12
PM MAIL WWW   Вверх
malor
  Дата 24.6.2011, 10:08 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Есть какой-то параметр, чтоб WriteFile внося запись затирал то, что было прежде?
Код
BOOL WINAPI WriteFile(
  __in          HANDLE hFile,
  __in          LPCVOID lpBuffer,
  __in          DWORD nNumberOfBytesToWrite,
  __out         LPDWORD lpNumberOfBytesWritten,
  __in          LPOVERLAPPED lpOverlapped
);


PM MAIL   Вверх
CodeMonkey
Дата 24.6.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(malor @  23.6.2011,  22:39 Найти цитируемый пост)
PS: Откуда пробелы между символами берутся?


Это не пробелы. Это нули. Unicode.

Подтянуть мат-часть: http://www.transl-gunsmoker.ru/2009/09/pchars.html#d2009 - и далее по ссылкам.

Цитата(malor @  24.6.2011,  11:08 Найти цитируемый пост)
WriteFile внося запись затирал то, что было прежде?


Он и так это делает.



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
malor
  Дата 25.6.2011, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Цитата(CodeMonkey @ 24.6.2011,  11:39)
Цитата(malor @  24.6.2011,  11:08 Найти цитируемый пост)
WriteFile внося запись затирал то, что было прежде?

Он и так это делает.

В данном коде два раза вызывается функция WriteFile(...) и на втором заходе она не уничтожает внесенную до этого запись:
Код
procedure TForm1.FormCreate(Sender: TObject);
var
    ByteWritten: cardinal;
    UnicodePrefix: Word;
    strEvent: String;
begin
  UnicodePrefix := $FEFF;
  hFileEventMouse:= CreateFile('D:\VM_remote\EventNewMouse.txt', GENERIC_READ or GENERIC_WRITE,
          FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, 0);
  WriteFile(hFileEventMouse, UnicodePrefix, SizeOf(Word), ByteWritten, nil);
  strEvent := '1_stroka'+ #13#10;
  WriteFile(hFileEventMouse, strEvent[1], Length(strEvent)* SizeOf(Char), ByteWritten, nil);
  strEvent := '2_stroka'+ #13#10;
  WriteFile(hFileEventMouse, strEvent[1], Length(strEvent)* SizeOf(Char), ByteWritten, nil);

end;

PM MAIL   Вверх
CodeMonkey
Дата 25.6.2011, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(malor @  25.6.2011,  10:23 Найти цитируемый пост)
на втором заходе


Что ты понимаешь под "вторым заходом"? 

В этом коде вообще не имеет значения, затирает ли WriteFile предыдущее содержимое или нет - потому что твой CreateFile каждый раз создаёт новый пустой файл, ибо CREATE_ALWAYS.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Dik0n
Дата 25.6.2011, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: нет
Всего: 10



Цитата(malor @  25.6.2011,  09:23 Найти цитируемый пост)
В данном коде два раза вызывается функция WriteFile(...) и на втором заходе она не уничтожает внесенную до этого запись:

Есть такое понятие как текущая позиция в файле, юзай

Код

SetFilePointer(hFile, 0, nil, FILE_BEGIN);

--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
malor
  Дата 26.6.2011, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 632
Регистрация: 17.11.2006

Репутация: нет
Всего: нет



Цитата(CodeMonkey @  25.6.2011,  09:29 Найти цитируемый пост)
Что ты понимаешь под "вторым заходом"? 
Внесение в файл строки: 
Код
strEvent := '2_stroka'+ #13#10;
WriteFile(hFileEventMouse, strEvent[1], Length(strEvent)* SizeOf(Char), ByteWritten, nil);

А можно писать функцией WriteFile() не в Unicode, а в ANSI?.
Я стал использовать функцию WriteFile() из-за возможности указать опцию FILE_SHARE_READ.
А до этого юзал WriteLn():
Rewrite(fEventKB);
WriteLn(fEventKB, ID_msg_KB);

PM MAIL   Вверх
bems
Дата 28.6.2011, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(malor @  26.6.2011,  18:02 Найти цитируемый пост)
А можно писать функцией WriteFile() не в Unicode, а в ANSI?.
пиши AnsiString а не String

Цитата(malor @  26.6.2011,  18:02 Найти цитируемый пост)
Я стал использовать функцию WriteFile() из-за возможности указать опцию FILE_SHARE_READ.
TFileStream тоже позволяет

Цитата(malor @  26.6.2011,  18:02 Найти цитируемый пост)
А до этого юзал WriteLn():
переменная FileMode, но не для F: TextFile



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1032 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.