Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Считываение данных из файла (http://forum.oszone.net/showthread.php?t=100680)

Student00 14-02-2008 22:53 740401

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

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

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 740463

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

Student00 20-02-2008 19:05 744852

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

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

DedAlex 20-02-2008 23:57 745100

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

Student00 28-02-2008 21:22 750158

Вобщем фигня какая-то получается.

Вобщем есть файл: 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 750327

Цитата:

Цитата 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 и т.д.

Student00 05-03-2008 19:59 754127

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

zip000 06-03-2008 00:09 754304

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

Student00 06-03-2008 14:53 754687

Цитата:

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

а для string в cardinal или longint?

zip000 07-03-2008 16:00 755453

Цитата:

Цитата Student00
а для string в cardinal или longint? »

То же самое, у этой функции параметр может быть любого (почти) целочисленного типа.

Student00 09-03-2008 19:43 756609

спасибо


Время: 14:17.

Время: 14:17.
© OSzone.net 2001-