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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2010, 11:35   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Записать двоичным методом строку.

Мне нужно двоичным методом (через BlockWrite) записать строку так, чтобы её можно было открыть через блокнот и увидеть, что содержалось в строке. Пробую так:
Код:
Program testofstr;
Var
 S:ShortString;
 F:File;
Begin
 AssignFile(F, '1.txt');
 Rewrite(F,1);
 S:='101';
 BlockWrite(F,S,SizeOf(S));
 CloseFile(F);
End.
Но записывает не 3 байта, а 256. Причем gedit кричит, что это двоичный файл и открывать его он не собирается. Открываю bless`ом и вижу следующее:
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 08.03.2010, 12:03   #2
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

Можно по одному символу записать
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс

Последний раз редактировалось Олвин; 08.03.2010 в 12:06.
Олвин вне форума Ответить с цитированием
Старый 08.03.2010, 12:05   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

А разница? Все равно запишет 256
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 08.03.2010, 12:20   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

А если так ?
Length(S);
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 08.03.2010, 12:21   #5
Олвин
Экспериментатор
Форумчанин
 
Аватар для Олвин
 
Регистрация: 16.04.2008
Сообщений: 218
По умолчанию

А так:
Код:
var
ch : char;
begin
{...}
for i := 1 to length(s) do
begin
ch := s[i];
BlockWrite(F, ch, SizeOf(ch));
end;
{...}
Для создания сложных вещей не нужны сложные интерфейсы. (с) Линус Торвальдс
Олвин вне форума Ответить с цитированием
Старый 08.03.2010, 12:33   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

sizeof берет размерность типа... всего-лишь исправь на...
Код:
BlockWrite(F, S, length(s));
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 08.03.2010, 12:34   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
всего-лишь исправь на...
Сейчас попробую...
Хм...
Цитата:
[здесь $03, но из-за цитаты он исчезает]10
Идет сдвиг на один байт. Потому, что в начале записывается $03 зачем-то. Это из-за никса?
А так замечательно, даже gedit читает.

P.S. Сделал через char, всем спасибо.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 08.03.2010 в 12:41.
Alex Cones вне форума Ответить с цитированием
Старый 08.03.2010, 16:11   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
Идет сдвиг на один байт. Потому, что в начале записывается $03 зачем-то. Это из-за никса?
Это паскалевский формат строки. Первым байтом идет длина.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 08.03.2010, 16:19   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Первым байтом идет длина.
Тю, епт. Точно. Что-то мне на ум все время шла сишная строка. Еще удивлялся, почему после 101 нули идут.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 09.03.2010, 08:29   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Добавлю на всякий пожаренный (или пожарный) что если использовать стандартные строки Делфи (String обычный) то писать нужно так:
Код:
Program testofstr;
Var
 S:String;
 F:File of char;
Begin
 AssignFile(F, '1.txt');
 Rewrite(F,1);
 S:='101';
 BlockWrite(F,S[1],Length(s));
 CloseFile(F);
End.
И все будет работать в ажуре
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как записать (считать) динамическую строку в (из) файл(а)? C++ Сергей089 Помощь студентам 2 10.02.2010 22:00
Записать строку в начало файла XPAiN Общие вопросы Delphi 6 26.01.2010 15:27
Как записать данные в таблицу полученные методом расчета? GenaRu Microsoft Office Access 3 18.12.2009 20:52
заданную строку записать в обратном порядке Defa4ka Помощь студентам 1 13.05.2009 11:50