Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Считываение данных из файла

Ответить
Настройки темы
Delphi - Считываение данных из файла

Пользователь


Сообщения: 131
Благодарности: 0

Профиль | Отправить PM | Цитировать


Кратко:
Есть файл мы из него читаем данные после чего для проверки что мы прочитали - выводим инфу виде сообщения, но вместо заданных в файле данных выводится какая-то фигня.

Подробно (упрощенная версия кода):
Код: Выделить весь код
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

 

Аватара для zip000

Техноманьяк


Сообщения: 1146
Благодарности: 184

Профиль | Отправить PM | Цитировать


Student00, ошибка в том, что тип файловой переменной должен быть TextFile, а не File of Cardinal. И данные в нем надо записывать через пробел (и читать методом Read), или каждое число на новой строке (и читать методом ReadLn).

-------
Глючит - значит существует. (с) Билл Гейтс


Отправлено: 02:02, 15-02-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 131
Благодарности: 0

Профиль | Отправить PM | Цитировать


...вернулся к этой проблеме...
zip000:
действительно, если определить переменную как текстовый файл, то в переменой fkey будет находиться нужное значение, но возникает другая проблема.
Как я сказал, в реальной программе:
В файле kei д/б число цельное, которое будет иметь размер 128 бит. мы должны разбить его на 4 части по 32 бита (кардиналы).
read(kei, fkey1, fkey2, fkey3, fkey4);
Но с TextFile все занчение файла записывается в первую переменную - fkey1.

{И еще на выходе д/б тип Кардинал (ну или лонгинт). Хотя это не проблема потом перевести нужные переменные в этот тип}. Главное перед этим их разбить на части.
ребят, подскажите плз можно ли это как-нить реализовать?

Отправлено: 19:05, 20-02-2008 | #3


Вредитель


Сообщения: 460
Благодарности: 126

Профиль | Отправить PM | Цитировать


Student00, дело в том, что вы пишете в файл текст, а потом пытаетесь его прочитать как число. Например, если записать в файл символ 1 и прочитать как текст, то это и будет 1, но если прочитать его как byte, то значение будет 49. Поэтому вы сначала определитесь, как и что вы будете записывать в этот файл. Или дайте точную задачу.

-------
Все сказаное является только моим личным мнением.


Отправлено: 23:57, 20-02-2008 | #4


Пользователь


Сообщения: 131
Благодарности: 0

Профиль | Отправить 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));
А т.к. каждая переменная кардинал то 32 *9 =288 >128 значит последние переменные д/б = 0

Но k1, k2, k3, k4, k5 = 808464432 (30 бит)

(2)Так же не понятно почему они идут бесконечным потоком и не заканчиваются?

В таком случае я вообще не могу понять как они считываются и вычисляются.

Ребят, подскажите пожалуйста, ибо у меня в голове каша!!!

Отправлено: 21:22, 28-02-2008 | #5


Аватара для zip000

Техноманьяк


Сообщения: 1146
Благодарности: 184

Профиль | Отправить PM | Цитировать


Цитата Student00:
В файле kei д/б число цельное, которое будет иметь размер 128 бит. мы должны разбить его на 4 части по 32 бита (кардиналы). »
Чтоб в каждой переменной оказались нужные данные, просто отделите их в файле пробелом, т.е. не
Цитата Student00:
340282366920937000000000000000000000000 »
а
34028236 69209370 00000000 0000000 00000000
Если запишете так, то при чтении
Цитата Student00:
read(kei, fkey1, fkey2, fkey3, fkey4); »
в key1 будет 34028236, в key2 69209370, в key3 00000000 и т.д.

-------
Глючит - значит существует. (с) Билл Гейтс


Отправлено: 02:58, 29-02-2008 | #6


Пользователь


Сообщения: 131
Благодарности: 0

Профиль | Отправить PM | Цитировать


Я там программку пример прикрепил, мне б понять почему при конвертации из типа string в тип integer считанные данные изменяются. т.е. строки мемо1 <> строкам мемо2
Притом при каждом новом запуске данные в числовом формате постоянно разные.
Помогите пожалуйста разобраться по какому принципу происходит конверт.

Последний раз редактировалось Student00, 13-03-2013 в 19:25.


Отправлено: 19:59, 05-03-2008 | #7


Аватара для zip000

Техноманьяк


Сообщения: 1146
Благодарности: 184

Профиль | Отправить PM | Цитировать


Student00, мой вам совет, почитайте сначала умных книжек для начинающих (ака чайников ), а потом пишите проги... Для преобразования string в integer надо юзать функцию StrToInt.

-------
Глючит - значит существует. (с) Билл Гейтс


Отправлено: 00:09, 06-03-2008 | #8


Пользователь


Сообщения: 131
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата zip000:
Для преобразования string в integer надо юзать функцию StrToInt. »
а для string в cardinal или longint?

Отправлено: 14:53, 06-03-2008 | #9


Аватара для zip000

Техноманьяк


Сообщения: 1146
Благодарности: 184

Профиль | Отправить PM | Цитировать


Цитата Student00:
а для string в cardinal или longint? »
То же самое, у этой функции параметр может быть любого (почти) целочисленного типа.

-------
Глючит - значит существует. (с) Билл Гейтс


Отправлено: 16:00, 07-03-2008 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Считываение данных из файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
.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




 
Переход