Войти

Показать полную графическую версию : Считываение данных из файла


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

Подробно (упрощенная версия кода):

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-мя

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

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

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

DedAlex
20-02-2008, 23:57
Student00, дело в том, что вы пишете в файл текст, а потом пытаетесь его прочитать как число. Например, если записать в файл символ 1 и прочитать как текст, то это и будет 1, но если прочитать его как byte, то значение будет 49. Поэтому вы сначала определитесь, как и что вы будете записывать в этот файл. Или дайте точную задачу. :)

Student00
28-02-2008, 21:22
Вобщем фигня какая-то получается.

Вобщем есть файл: 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)Так же не понятно почему они идут бесконечным потоком и не заканчиваются?

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

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

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

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

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

Student00
06-03-2008, 14:53
Для преобразования string в integer надо юзать функцию StrToInt. »
а для string в cardinal или longint?

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

Student00
09-03-2008, 19:43
спасибо




© OSzone.net 2001-2012