|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.07.2015, 11:34 | #1 |
Форумчанин
Регистрация: 11.05.2013
Сообщений: 154
|
Проблема с чтением файла (TFileStream)
Всем привет.
Пишу программу, которая должна уметь сохранять и читать данные из файла (обязательно через TFileStream), при этом часть данных представлена в виде двумерного динамического массива. С сохранением проблем нет (вроде бы, хотя утверждать не берусь - одним WinHex-ом многое не расскажешь), проблема с чтением файла. В чем именно она заключается - я не знаю, и уже перепробовал буквально все. Самое странное, что запись и чтение - два практически идентичных метода (различие только в Read/Write), поэтому у меня уже даже предположения закончились по поводу того, где может быть косяк. Исходник программы прилагаю (он небольшой - лишь основной код, который вынес в отдельный проект, чтобы людям было проще по нему ориентироваться). Код оформлен. В общем, я надеюсь на вашу помощь, потому как других вариантов у меня уже просто нет P.S. Delphi 7 Последний раз редактировалось Xo66um; 24.07.2015 в 20:39. |
24.07.2015, 11:44 | #2 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,774
|
Код:
Чтобы не морочиться, проще всего переделать на array of array of AnsiString и переписать соответствующим образом загрузку и сохранение файла. |
24.07.2015, 11:44 | #3 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
Stream.Write(Matrix[X,Y], SizeOf(Matrix));
наводка - ну и какие значения в SizeOf(Matrix)? почему использован PChar? пользуй string
Не стесняемся, плюсуем!
|
24.07.2015, 12:06 | #4 |
Форумчанин
Регистрация: 11.05.2013
Сообщений: 154
|
Спасибо за быстрые ответы.
Честно говоря, что со String, что с PChar - ни так, и ни эдак - не работает, увы. Память не выделял под PChar, да. Но я уверен, что выделение памяти в данном случае не требуется (или я ошибаюсь?). Изначально использовался тип Char, но чтобы не мучиться с указателями - начал использовать PAnsiChar. UPD: Попробовал использовать все-таки тип String - ошибка сохранилась, также пробовал выделять и освобождать память (StrAlloc и StrDispose) - без толку. Последний раз редактировалось Xo66um; 24.07.2015 в 12:32. |
24.07.2015, 12:36 | #5 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Код:
P.S. Не проверял.
I'm learning to live...
|
24.07.2015, 12:53 | #6 |
Форумчанин
Регистрация: 11.05.2013
Сообщений: 154
|
Stilet, большое спасибо! Код рабочий
Правда, Delphi 7 не воспринимает WriteInteger и ReadInteger, поэтому пришлось подправить: Код:
Но у меня два вопроса: 1. Возможна-ли поддержка юникода с типом string в Delphi 7? 2. Почему все-таки мой код чтения файла выбрасывает ошибку? Дело в неверной записи в файл, или что-то еще? Если так, то не могли-бы вы объяснить, в чем заключается ошибка? P.S. Обидно, но я почему-то не могу добавить плюс в репутацию - форум выдает сообщение (на скриншоте). UPD: Все, понял, в чем была ошибка... Спасибо еще раз всем, и особенно Stilet Но вопрос по поводу юникода все еще неясен. Последний раз редактировалось Xo66um; 24.07.2015 в 13:04. |
24.07.2015, 13:12 | #7 | |||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
Цитата:
I'm learning to live...
Последний раз редактировалось Stilet; 24.07.2015 в 13:15. |
|||
24.07.2015, 13:22 | #8 | |
Форумчанин
Регистрация: 11.05.2013
Сообщений: 154
|
Ну, даже если нет, то дальше я уже точно должен сам код модифицировать, а то как-то стыдно)
Цитата:
Понятно. Но все равно, спасибо вам большое, еще раз, от всей души, помогли |
|
24.07.2015, 13:55 | #9 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Пожалуйста )
I'm learning to live...
|
25.07.2015, 20:15 | #10 | |
фонатик DELPHI
Форумчанин
Регистрация: 14.01.2008
Сообщений: 714
|
Цитата:
------------- ответы. Как правильно подчеркнул Виталий (Stilet) самый удобный, безопасный и стопроцентный обмен данными в Делфи 7 через TFileStream, лучше организовывать посредством чтения/записи массива байтов. Причём следует учитывать следующие особенности 1. PChar и все порождения от него (PAnsiChar, Pointer и.т.п) - для делфи это указатель на память размером 4 байт (тупой адрес). Поэтому, если используете информацию которая хранится в PCHar (например Вам прислала какая то Сишная Длл-ка) то следует организовать запись сначала 4 байт размер, потом тело. Код:
Код:
Код:
3. структуры. Структуры ВСЕГДА! нужно упаковывать перед записью, дабы не заниматься байтод...черством (вырваниваением полей в памяти) которым успешно занимаются Сишники перед подобными действиями. Пример ниже пишется с packed Код:
Код:
Код:
5. WideString (Юникодовские строки). В отличии от строки и PChar Юникодовские строки пишутся/читаются как массив Код:
95% сбоев и ошибок приложений, находится в полу метрах от монитора
Последний раз редактировалось JUDAS; 25.07.2015 в 20:18. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема с чтением файла. | the27mart | Общие вопросы C/C++ | 4 | 18.11.2012 22:36 |
Проблема с чтением из типизированного файла | BeCTHuK | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 05.10.2011 20:57 |
проблема с чтением из файла | salwator | Помощь студентам | 1 | 23.12.2010 12:11 |
Проблема с чтением из файла | slamm | PHP | 12 | 16.01.2010 16:40 |
проблема с чтением из файла | Tesmont | Общие вопросы C/C++ | 0 | 20.05.2009 19:39 |