Показать полную графическую версию : Считываение данных из файла
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-мя
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.
{И еще на выходе д/б тип Кардинал (ну или лонгинт). Хотя это не проблема потом перевести нужные переменные в этот тип}. Главное перед этим их разбить на части.
ребят, подскажите плз можно ли это как-нить реализовать?
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)Так же не понятно почему они идут бесконечным потоком и не заканчиваются?
В таком случае я вообще не могу понять как они считываются и вычисляются.
Ребят, подскажите пожалуйста, ибо у меня в голове каша!!!
В файле 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
Притом при каждом новом запуске данные в числовом формате постоянно разные.
Помогите пожалуйста разобраться по какому принципу происходит конверт.
Student00, мой вам совет, почитайте сначала умных книжек для начинающих (ака чайников ;) ), а потом пишите проги... Для преобразования string в integer надо юзать функцию StrToInt.
Student00
06-03-2008, 14:53
Для преобразования string в integer надо юзать функцию StrToInt. »
а для string в cardinal или longint?
а для string в cardinal или longint? »
То же самое, у этой функции параметр может быть любого (почти) целочисленного типа.
Student00
09-03-2008, 19:43
спасибо
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.