Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2011, 23:34   #1
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию Чтение любых файлов.

В одной из тем приводился код:
Код:
var OD:TOpenDialog;  //Диалог открытия файла(переменка)
    F:File;   //файл для чтения
    B:array[1..1024] of char;  //буфер
    N:integer;                //кол-во прочитаннх байт за один присест

begin
 Memo1.Text:='';            //очищаем мемо
 OD:=TOpenDialog.Create(Form1);   //создаем диалог
 if OD.Execute then begin      //показываем диалог, если выбрали файл...
              assignfile(f,OD.FileName); //...то,открываем файл
              reset(f,1);
              while not EoF(F) do          //пока есть что читать то читаем..
               begin
                    BlockRead(F,b[1],1024,N);   //пробуем прочесть весь буфер
                     Memo1.Text:=Memo1.Text+Copy(B,1,N); //копируем то сколько прочли
                end;
                CloseFile(F); //закрываем файл.
            end
            else Close; //...иначе выходим
 OD.Free;  //уничтожжаем диалог.
end;
Код полностью рабочий, окрывает любые файлы, но почему если вместо memo1.text указать переменую типа string и отрыть exe или doc файл то в переменную запишется не все содержимое файла? Хотя memo1.text принадлежит типу string.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 09.01.2011 в 00:03.
qwertyk вне форума Ответить с цитированием
Старый 08.01.2011, 23:39   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от qwertyk Посмотреть сообщение
в переменную запишется не все содержимое файла
как проверяли?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.01.2011, 23:41   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а версия Делфи какая?
для надежности в этом коде надо ставить AnsiChar
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.01.2011, 23:47   #4
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Цитата:
как проверяли?
вместо
Цитата:
Memo1.Text:=Memo1.Text+Copy(B,1,N); //копируем то сколько прочли
написал
Цитата:
s:=s+Copy(B,1,N); //копируем то сколько прочли
естественно в переменных я указал s, и конце кода написал showmessage(s);


Цитата:
а версия Делфи какая?
v.7.3.3.5
qwertyk вне форума Ответить с цитированием
Старый 08.01.2011, 23:51   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от qwertyk Посмотреть сообщение
showmessage(s)
хм.. это ж какой экран надо иметь, чтобы вывести весь экзешник на него. В любом случае, showmessage() остановился на первом #0, и правильно сделал. Но это не значит, что в s не весь файл.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.01.2011, 23:53   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы уверены что не все?
может просто не просмотреть весь файл в одном окне.
чтоб проверить можно в конце написать такое
if FileSize(F)<>Length(s) then ShowMessage('размеры не совпадают');
это вставить перед CloseFile
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.01.2011, 23:55   #7
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Цитата:
В любом случае, showmessage() остановился на первом #0
Если код не преобразовывать и дописать s:=memo1.text; showmessage(s) то сообщение выведет весь текст и не остановится на первом #0.
qwertyk вне форума Ответить с цитированием
Старый 08.01.2011, 23:58   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что мемо преобразует текст в читабельный вид, однако если записать его обратно в файл, то файлы получатся разные.
запомните Memo.Text это св-во.
Memo.Text:=s;
сводится к Memo.SetText(s);
а далее там преобразуются нечитабельные символы в закорючки.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.01.2011, 00:14   #9
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Спасибо, Пепел Феникса! Теперь немного разобрался. Тема закрыта.
qwertyk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение текстовых файлов. the_deer_one Общие вопросы C/C++ 3 05.04.2010 14:06
Чтение обновленных файлов Gambler Работа с сетью в Delphi 4 03.12.2009 08:31
чтение файлов Neymexa Общие вопросы .NET 2 07.04.2009 11:03
Чтение Бинарных Файлов Maksitron Общие вопросы C/C++ 6 23.02.2009 21:37
Чтение файлов с диска Wolf-alone Общие вопросы C/C++ 1 17.09.2008 10:05