![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| pushok |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 7.2.2007 Репутация: нет Всего: нет |
Здравствуйте = )
Ситуация: использую TFileStream для записи и чтения из файла переменных разных типов. Проблема: записываю русский текст в переменную (string). Переменную записываю в файл. Открываю файл и он мне выводит вместо строки чушь какую-то. Соответственно весь оставшийся файл испорчен (видимо русский текст занимает больше чем 4 Кбайта. При этом заметил такую особенность: если я записываю файл и открываю его не выходя из программы - все в порядке! В чем дело? Может кто-то сталкивался? |
|||
|
||||
| Qu1nt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 602 Регистрация: 13.1.2007 Репутация: 22 Всего: 50 |
Телепаты на юге. Код в студию!
|
|||
|
||||
| AntonN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 491 Регистрация: 8.8.2006 Репутация: 3 Всего: 18 |
смотря как записывать переменную string, у нее нулевой байт не нужно записывать
|
|||
|
||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 0 Всего: 7 |
Помимо кода версию Delphi не забудь.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| bems |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Именно переменную?
Да, было бы не плохо.
Ну в новых версиях дельфи строки стали уникодными, но вполне возможно писать так, чтобы оно корректно работало под любой версией (ну кроме первой). Нужно просто вместо 1 байта на симбол использовать SizeOf(Char) Добавлено через 57 секунд Модератор: И да, вопрос-то для начинающих! -------------------- Обижено школьников: 8 |
||||||
|
|||||||
| pushok |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 7.2.2007 Репутация: нет Всего: нет |
Вообщем суть такая:
ПРо русский я наврал = )) Попробовал и английский тоже косячит. 4 кило взялось из строки: ShowMessage(IntToStr(SizeOf(String))) или ShowMessage(IntToStr(SizeOf(t.s))). |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Ну так и есть, пишешь указатель. Не все телепаты в отпуске
SizeOf возвращает значение в байтах. 4 байта - потому что строка на самом деле указатель на символы. а размер указателя - 4 байта. Чтобы записать собственно строку, делай что-то такое
Только когда ты захочешь прочитать, то окажется что длина строки неизвестна. Поэтому записывай сначала длину, потом строку как я показал. Тогда читаешь длину и определяешь сколько байт в строке (длина строки умножить на размер символа) -------------------- Обижено школьников: 8 |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| pushok |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 7.2.2007 Репутация: нет Всего: нет |
Спасибо всем за обсуждение и помощь.
Думаю проблемы больше нет = ) За ссылки отдельное спасибо, доступно написано. |
|||
|
||||
| pushok |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 92 Регистрация: 7.2.2007 Репутация: нет Всего: нет |
При выводе переменной e на экран получается больше 20 тыс, однако должно быть меньше. Подскажите в чем дело. ?? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
выглядит нормально. Ошибка где-то в другом месте.
-------------------- Обижено школьников: 8 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
У битмапов есть свой метод чтения из потока. ограничение этого метода - Tbitmap читает от текущей позиции указателя в потоке и до конца потока, вне зависимости от того, его данные содержатся там или нет. А в вашем коде считывается вместо полных данных битмапа только первые 4 байта. И то, что считывается в переменную e на самом деле должно было считаться в битмап. Для анализа работы с потоками нужно помнить, что Read и Write - это функции, и они возвращают количество реально считанного/записанного. В режиме пошаговой отладки бывает полезно вывести в Watches myStream.Position. Это было раз. Второе - из кода непонятно, а почему собственно должно было считаться число меньшее 20000? Может, вы записали в поток больше 20000? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
эээ... То есть TBitmap это Graphics.TBitmap? мда... Тогда читаем kami
-------------------- Обижено школьников: 8 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 22 Всего: 72 |
Я без малейшего понятия. Но думаю, что автор не должен был додуматься перекрыть своим объявление этого класса Что затрудняет работу телепатора в автономном режиме |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |