Страница 1 из 1

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

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

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

пробовал преобразовывать в PCar, ANSI, не помогло.
думаю посимвольно запишется верно, но хотелось бы понять причину данной ситуации
как избавиться от этого байта

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

СообщениеДобавлено: 13.01.2015 13:51:10
Kitayets
пишите с 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) врятли прокатит...

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

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

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

СообщениеДобавлено: 13.01.2015 15:05:40
hinst
длина строки возвращается функцией 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

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

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

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


Не там. 0B это VT -- Vertical Tabulation (Вертикальное Табулирование). Можешь считать это вариантом 2.

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

СообщениеДобавлено: 13.01.2015 15:40:23
putrsa
Понял, спасибо

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

СообщениеДобавлено: 13.01.2015 15:59:00
Лекс Айрин
Предполагаю, что символы в строке выбираются с конца и указывая больше на 1 символ чем надо захватывается байт из комбинации завершающую предыдущую строку.

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

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

Это только в том случае, если компилятор настроен так, что String — это ShortString. А если AnsiString, то — нет, это именно что указатель с подсчётом ссылок.

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

СообщениеДобавлено: 13.01.2015 20:41:18
zub
>>blockwrite(OUTFile, S[1], sizeof(Char) * length(S));
правильнее будет
blockwrite(OUTFile, S[1], sizeof(S[1]) * length(S));

Кроме того, чтоб потом эту строчку прочитать нужно незабыть перед строкой записать ее длину

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

СообщениеДобавлено: 15.02.2015 20:41:33
Stertor
blockwrite(OUTFile, S, sizeof(S));

Используйте TFilestream/TMemorystream, удобнее же.