Страница 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, удобнее же.