лишний байт при записи строки в файл

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

лишний байт при записи строки в файл

Сообщение putrsa » 13.01.2015 12:13:40

при записи строки в файл, перед строкой S пишется лишний байт '0B'
пишу так:
Код: Выделить всё
blockwrite(OUTFile, S, sizeof(S)); 

строка берется из
Код: Выделить всё
StringGrid1.Cells[0,i]

пробовал преобразовывать в PCar, ANSI, не помогло.
думаю посимвольно запишется верно, но хотелось бы понять причину данной ситуации
как избавиться от этого байта
putrsa
незнакомец
 
Сообщения: 3
Зарегистрирован: 23.01.2013 15:26:28

Re: лишний байт при записи строки в файл

Сообщение Kitayets » 13.01.2015 13:51:10

пишите с s[1].
вообще может так надо: blockwrite(OUTFile, S[1], sizeof(Char) * length(S)); ??

Добавлено спустя 4 минуты 58 секунд:
во всяком случае у меня вот так:
Код: Выделить всё
var
  s: string;
  p: pointer;
begin
s:= 'abcdef';
writeln('sizeof string = ', sizeof(s));
  writeln('sizeof pointer = ', sizeof(p));
end. 

sizeof string = 4
sizeof pointer = 4


Добавлено спустя 2 минуты 25 секунд:
хотя с юникодными (utf-8) строками sizeof(Char) * length(S) врятли прокатит...
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: лишний байт при записи строки в файл

Сообщение putrsa » 13.01.2015 14:47:11

Благодарю, прокатило
Код: Выделить всё
blockwrite(OUTFile, S[1], sizeof(S)-1);
но все же не понятно, откуда вначале строки присутствует байт 0B. В доках не нашел. Может не там искал?
sizeof string = 4
- тоже не пойму это типа размер указателя? а не строки?
putrsa
незнакомец
 
Сообщения: 3
Зарегистрирован: 23.01.2013 15:26:28

Re: лишний байт при записи строки в файл

Сообщение hinst » 13.01.2015 15:05:40

длина строки возвращается функцией Length
типа Length(s)
String это указатель с подсчётом ссылок; строки бывают статические shortstring и динамические string ansistring ... ;
Первый символ строки это s[1] потому что в паскале строки с символа 1 (но в новых Delphi сделали вроде с 0, однако в FreePascal пока остаётся 1)
s это указатель
s[1] это первый симвоол

Добавлено спустя 2 минуты 10 секунд:
у BlockWrite второй аргумент - "const buf" (см справку по BlockWrite) что означает, что фактически передаётся указатель но не явно, то есть, надо передавать как бы сам символ s[1] хотя на самом деле передаётся указатель s
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: лишний байт при записи строки в файл

Сообщение Лекс Айрин » 13.01.2015 15:28:40

hinst, первый символ строки в String это вообще-то счетчик символов... вот как раз он и стоит в нулевой позиции. Видимо, он тоже пишется в файл.

putrsa писал(а):но все же не понятно, откуда вначале строки присутствует байт 0B. В доках не нашел. Может не там искал?


Не там. 0B это VT -- Vertical Tabulation (Вертикальное Табулирование). Можешь считать это вариантом 2.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: лишний байт при записи строки в файл

Сообщение putrsa » 13.01.2015 15:40:23

Понял, спасибо
putrsa
незнакомец
 
Сообщения: 3
Зарегистрирован: 23.01.2013 15:26:28

Re: лишний байт при записи строки в файл

Сообщение Лекс Айрин » 13.01.2015 15:59:00

Предполагаю, что символы в строке выбираются с конца и указывая больше на 1 символ чем надо захватывается байт из комбинации завершающую предыдущую строку.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: лишний байт при записи строки в файл

Сообщение Дож » 13.01.2015 19:40:27

Лекс Айрин писал(а):hinst, первый символ строки в String это вообще-то счетчик символов... вот как раз он и стоит в нулевой позиции. Видимо, он тоже пишется в файл.

Это только в том случае, если компилятор настроен так, что String — это ShortString. А если AnsiString, то — нет, это именно что указатель с подсчётом ссылок.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: лишний байт при записи строки в файл

Сообщение zub » 13.01.2015 20:41:18

>>blockwrite(OUTFile, S[1], sizeof(Char) * length(S));
правильнее будет
blockwrite(OUTFile, S[1], sizeof(S[1]) * length(S));

Кроме того, чтоб потом эту строчку прочитать нужно незабыть перед строкой записать ее длину
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: лишний байт при записи строки в файл

Сообщение Stertor » 15.02.2015 20:41:33

blockwrite(OUTFile, S, sizeof(S));

Используйте TFilestream/TMemorystream, удобнее же.
Аватара пользователя
Stertor
новенький
 
Сообщения: 20
Зарегистрирован: 10.08.2014 18:11:12


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: MailRu[bot] и гости: 21

Рейтинг@Mail.ru
cron