|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Считываение данных из файла |
|
|
Delphi - Считываение данных из файла
|
Пользователь Сообщения: 131 |
Кратко:
Есть файл мы из него читаем данные после чего для проверки что мы прочитали - выводим инфу виде сообщения, но вместо заданных в файле данных выводится какая-то фигня. Подробно (упрощенная версия кода): procedure TForm1.Button1Click(Sender: TObject); var kei: File of cardinal; keyname: String; fkey: cardinal; begin keyname:=Edit1.Text; AssignFile(kei, keyname); Reset(kei); read(kei, fkey); CloseFile(kei); ShowMessage(inttostr(fkey)); end; Допустим keyname - 1.txt, в который мы записываем число: 4294967295 Читаем файл kei и передаем из него информацию в переменную fkey [read(kei, fkey);] ShowMessage(inttostr(fkey)); По логике в сообщении д/б число 4294967295 (или оно же в другой системе счисления), но выводится 876163636. Ребят подскажите пожалуйста почему так происходит? ------------------ Дело в том, что в реальной программе var kei: file of Cardinal; fkey1, fkey2, fkey3, fkey4: Cardinal; А считываем мы так: read(kei, fkey1, fkey2, fkey3, fkey4); где kei (т.е. файл) содержит строку = 128 бит и мы разбиваем 128/4 = 32 (fkey1-4) Опять же по логике если я добавлю пятую переменную fkey5, то она д/б = 0 и все последующие, но это не так она также хранит непонятное число схожее с первыми 4-мя |
|
Отправлено: 22:53, 14-02-2008 |
Техноманьяк Сообщения: 1146
|
Профиль | Отправить PM | Цитировать Student00, ошибка в том, что тип файловой переменной должен быть TextFile, а не File of Cardinal. И данные в нем надо записывать через пробел (и читать методом Read), или каждое число на новой строке (и читать методом ReadLn).
|
------- Отправлено: 02:02, 15-02-2008 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 131
|
Профиль | Отправить PM | Цитировать ...вернулся к этой проблеме...
zip000: действительно, если определить переменную как текстовый файл, то в переменой fkey будет находиться нужное значение, но возникает другая проблема. Как я сказал, в реальной программе: В файле kei д/б число цельное, которое будет иметь размер 128 бит. мы должны разбить его на 4 части по 32 бита (кардиналы). read(kei, fkey1, fkey2, fkey3, fkey4); Но с TextFile все занчение файла записывается в первую переменную - fkey1. {И еще на выходе д/б тип Кардинал (ну или лонгинт). Хотя это не проблема потом перевести нужные переменные в этот тип}. Главное перед этим их разбить на части. ребят, подскажите плз можно ли это как-нить реализовать? |
Отправлено: 19:05, 20-02-2008 | #3 |
Вредитель Сообщения: 460
|
Профиль | Отправить PM | Цитировать Student00, дело в том, что вы пишете в файл текст, а потом пытаетесь его прочитать как число. Например, если записать в файл символ 1 и прочитать как текст, то это и будет 1, но если прочитать его как byte, то значение будет 49. Поэтому вы сначала определитесь, как и что вы будете записывать в этот файл. Или дайте точную задачу.
![]() |
------- Отправлено: 23:57, 20-02-2008 | #4 |
Пользователь Сообщения: 131
|
Профиль | Отправить PM | Цитировать Вобщем фигня какая-то получается.
Вобщем есть файл: key.txt Из него мы считываем информацию (там 128 битное число в десятичной форме: 340282366920937000000000000000000000000) keyname:=key.txt; AssignFile(key, keyname); Reset(key); read(key, fkey1, fkey2, fkey3, fkey4); CloseFile(key); var key: мне не важно какого типа будет файл главное чтобы: 128 битное чило разбивалось на 4 32 битных (read(key, fkey1, fkey2, fkey3, fkey4); ) для этого мы должны взять тип данных cardinal (или longint), значит и переменная-файл key должна иметь тип данных такой же как и эти 4 переменные, т.е cardinal (или longint). Дальше: посмотрим что у нас получилось в переменных fkey1, fkey2, fkey3, fkey4 после считывания из файла: keyname:=key.txt; AssignFile(key, keyname); Reset(key); read(key, fkey1, fkey2, fkey3, fkey4); CloseFile(key); ShowMessage(inttostr(fkey1)); ShowMessage(inttostr(fkey2)); ShowMessage(inttostr(fkey3)); ShowMessage(inttostr(fkey4)); 842019891 = 110010001100000011010000110011 (30 бит) 909324856 = 110110001100110011001000111000 (30 бит) 808597814 = ... 30 бит 808923961 = ... 30 бит Как видно, все они имеют длину 30 бит. Но ведь мы взяли 128 битное число (в dec), а тип данных кардинал, значит они по идеи д/б = 32 битам!!!! (1) Совершенно не понятно что это за числа и каким образом они высчитываются. Ладно шут с ним с числами получились и получились. Пердположим что они всетаки правильные. Добавим еще с пяток переменных: keyname:=key.txt; AssignFile(key, keyname); Reset(key); read(key, fkey1, fkey2, fkey3, fkey4, k1, k2, k3, k4, k5); CloseFile(key); ShowMessage(inttostr(fkey1)); ShowMessage(inttostr(fkey2)); ShowMessage(inttostr(fkey3)); ShowMessage(inttostr(fkey4)); ShowMessage(inttostr(k1)); ShowMessage(inttostr(k2)); ShowMessage(inttostr(k3)); ShowMessage(inttostr(k4)); ShowMessage(inttostr(k5)); Но k1, k2, k3, k4, k5 = 808464432 (30 бит) (2)Так же не понятно почему они идут бесконечным потоком и не заканчиваются? В таком случае я вообще не могу понять как они считываются и вычисляются. Ребят, подскажите пожалуйста, ибо у меня в голове каша!!! |
|
Отправлено: 21:22, 28-02-2008 | #5 |
Техноманьяк Сообщения: 1146
|
Профиль | Отправить PM | Цитировать Цитата Student00:
Цитата Student00:
34028236 69209370 00000000 0000000 00000000 Если запишете так, то при чтении Цитата Student00:
|
|||
------- Отправлено: 02:58, 29-02-2008 | #6 |
Пользователь Сообщения: 131
|
Профиль | Отправить PM | Цитировать Я там программку пример прикрепил, мне б понять почему при конвертации из типа string в тип integer считанные данные изменяются. т.е. строки мемо1 <> строкам мемо2
Притом при каждом новом запуске данные в числовом формате постоянно разные. Помогите пожалуйста разобраться по какому принципу происходит конверт. |
Последний раз редактировалось Student00, 13-03-2013 в 19:25. Отправлено: 19:59, 05-03-2008 | #7 |
Техноманьяк Сообщения: 1146
|
Профиль | Отправить PM | Цитировать Student00, мой вам совет, почитайте сначала умных книжек для начинающих (ака чайников
![]() |
------- Отправлено: 00:09, 06-03-2008 | #8 |
Пользователь Сообщения: 131
|
Профиль | Отправить PM | Цитировать Цитата zip000:
|
|
Отправлено: 14:53, 06-03-2008 | #9 |
Техноманьяк Сообщения: 1146
|
Профиль | Отправить PM | Цитировать Цитата Student00:
|
|
------- Отправлено: 16:00, 07-03-2008 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
.NET - Чтение определенных данных с файлов(есть пример проги и файла) | crashtuak | Программирование и базы данных | 1 | 18-05-2009 15:14 | |
Прочие БД - не сохраняет базу данных и не восстанавливает ее из файла | slava400 | Программирование и базы данных | 0 | 03-11-2008 18:08 | |
MSFT SQL Server - Размер файла базы данных MS SQL | Odessit | Программирование и базы данных | 7 | 29-04-2007 07:35 | |
Восстановление данных из видео файла без заголовка файла | AlexKKK | Видео и аудио: обработка и кодирование | 13 | 31-05-2006 15:27 | |
Вывод данных из файла на PHP | fossil | Вебмастеру | 6 | 12-10-2005 22:59 |
|