| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > TFileStream и русский язык |
| Автор: pushok 5.10.2009, 21:40 |
| Здравствуйте = ) Ситуация: использую TFileStream для записи и чтения из файла переменных разных типов. Проблема: записываю русский текст в переменную (string). Переменную записываю в файл. Открываю файл и он мне выводит вместо строки чушь какую-то. Соответственно весь оставшийся файл испорчен (видимо русский текст занимает больше чем 4 Кбайта. При этом заметил такую особенность: если я записываю файл и открываю его не выходя из программы - все в порядке! В чем дело? Может кто-то сталкивался? |
| Автор: Qu1nt 5.10.2009, 21:50 |
| Телепаты на юге. Код в студию! |
| Автор: AntonN 5.10.2009, 21:58 |
| смотря как записывать переменную string, у нее нулевой байт не нужно записывать |
| Автор: Beltar 5.10.2009, 22:37 |
| Помимо кода версию Delphi не забудь. |
| Автор: pushok 6.10.2009, 02:46 | ||
Вообщем суть такая:
ПРо русский я наврал = )) Попробовал и английский тоже косячит. 4 кило взялось из строки: ShowMessage(IntToStr(SizeOf(String))) или ShowMessage(IntToStr(SizeOf(t.s))). |
| Автор: bems 6.10.2009, 03:12 | ||
| Ну так и есть, пишешь указатель. Не все телепаты в отпуске SizeOf возвращает значение в байтах. 4 байта - потому что строка на самом деле указатель на символы. а размер указателя - 4 байта. Чтобы записать собственно строку, делай что-то такое
Только когда ты захочешь прочитать, то окажется что длина строки неизвестна. Поэтому записывай сначала длину, потом строку как я показал. Тогда читаешь длину и определяешь сколько байт в строке (длина строки умножить на размер символа) |
| Автор: CodeMonkey 6.10.2009, 08:24 |
| http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1206#06. http://transl-gunsmoker.blogspot.com/2009/09/pchars.html. |
| Автор: pushok 6.10.2009, 08:45 |
| Спасибо всем за обсуждение и помощь. Думаю проблемы больше нет = ) За ссылки отдельное спасибо, доступно написано. |
| Автор: pushok 6.10.2009, 23:56 | ||
При выводе переменной e на экран получается больше 20 тыс, однако должно быть меньше. Подскажите в чем дело. ?? |
| Автор: bems 7.10.2009, 00:08 |
| выглядит нормально. Ошибка где-то в другом месте. |
| Автор: kami 7.10.2009, 00:10 |
У битмапов есть свой метод чтения из потока. ограничение этого метода - Tbitmap читает от текущей позиции указателя в потоке и до конца потока, вне зависимости от того, его данные содержатся там или нет. А в вашем коде считывается вместо полных данных битмапа только первые 4 байта. И то, что считывается в переменную e на самом деле должно было считаться в битмап. Для анализа работы с потоками нужно помнить, что Read и Write - это функции, и они возвращают количество реально считанного/записанного. В режиме пошаговой отладки бывает полезно вывести в Watches myStream.Position. Это было раз. Второе - из кода непонятно, а почему собственно должно было считаться число меньшее 20000? Может, вы записали в поток больше 20000? |
| Автор: bems 7.10.2009, 00:13 |
| эээ... То есть TBitmap это Graphics.TBitmap? мда... Тогда читаем kami |
| Автор: kami 7.10.2009, 00:17 |
Я без малейшего понятия. Но думаю, что автор не должен был додуматься перекрыть своим объявление этого класса Что затрудняет работу телепатора в автономном режиме |
| Автор: bems 7.10.2009, 00:32 | ||
|
| Автор: kami 7.10.2009, 01:16 | ||
Упс... забыл про него... Чего-то у нас много получается "подумал-забыл". Для ТС: на всякий случай (не знаю, будет полезно или нет) - процедуры чтения и записи того, что спрашивалось (само собой - применять только парами).
|
| Автор: THandle 7.10.2009, 08:43 |
| kami, а как же try..finally в последних двух процедурках? pushok, вообще глянь еще такую штуку как http://forum.vingrad.ru/forum/topic-250409.html. Там реализовано много методов для записи и чтения различных данных. |
| Автор: kami 7.10.2009, 09:14 | ||
а я так и написал:
А если честно - "ниахоооота" (с) мультик про Великого Нехочуху. |
| Автор: pushok 9.10.2009, 14:40 | ||
По аналогии написал две функции для TStringList. Выкладываю на всякий случай (вроде работает, но если какие-то ошибки). А строки решил пока по-обычному записывать (string[1]).
Всем большое спасибо. |
| Автор: THandle 10.10.2009, 09:23 |
Такие вещи, как обработка ошибок должны всегда в первую очередь писаться. Вот у pushok теперь потенциальноошибконеобрабатываемый код. pushok, используй try..finally при создании доп потоков, плюс я бы еще проверял на всякий случай все эти входящие параметры на существование(if not Assigned() then Exit). |