![]() |
Считываение данных из файла
Кратко:
Есть файл мы из него читаем данные после чего для проверки что мы прочитали - выводим инфу виде сообщения, но вместо заданных в файле данных выводится какая-то фигня. Подробно (упрощенная версия кода): Код:
procedure TForm1.Button1Click(Sender: TObject); Допустим 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).
|
...вернулся к этой проблеме...
zip000: действительно, если определить переменную как текстовый файл, то в переменой fkey будет находиться нужное значение, но возникает другая проблема. Как я сказал, в реальной программе: В файле kei д/б число цельное, которое будет иметь размер 128 бит. мы должны разбить его на 4 части по 32 бита (кардиналы). read(kei, fkey1, fkey2, fkey3, fkey4); Но с TextFile все занчение файла записывается в первую переменную - fkey1. {И еще на выходе д/б тип Кардинал (ну или лонгинт). Хотя это не проблема потом перевести нужные переменные в этот тип}. Главное перед этим их разбить на части. ребят, подскажите плз можно ли это как-нить реализовать? |
Student00, дело в том, что вы пишете в файл текст, а потом пытаетесь его прочитать как число. Например, если записать в файл символ 1 и прочитать как текст, то это и будет 1, но если прочитать его как byte, то значение будет 49. Поэтому вы сначала определитесь, как и что вы будете записывать в этот файл. Или дайте точную задачу. :)
|
Вобщем фигня какая-то получается.
Вобщем есть файл: key.txt Из него мы считываем информацию (там 128 битное число в десятичной форме: 340282366920937000000000000000000000000) Код:
keyname:=key.txt; var key: мне не важно какого типа будет файл главное чтобы: 128 битное чило разбивалось на 4 32 битных (read(key, fkey1, fkey2, fkey3, fkey4); ) для этого мы должны взять тип данных cardinal (или longint), значит и переменная-файл key должна иметь тип данных такой же как и эти 4 переменные, т.е cardinal (или longint). Дальше: посмотрим что у нас получилось в переменных fkey1, fkey2, fkey3, fkey4 после считывания из файла: Код:
keyname:=key.txt; 842019891 = 110010001100000011010000110011 (30 бит) 909324856 = 110110001100110011001000111000 (30 бит) 808597814 = ... 30 бит 808923961 = ... 30 бит Как видно, все они имеют длину 30 бит. Но ведь мы взяли 128 битное число (в dec), а тип данных кардинал, значит они по идеи д/б = 32 битам!!!! (1) Совершенно не понятно что это за числа и каким образом они высчитываются. Ладно шут с ним с числами получились и получились. Пердположим что они всетаки правильные. Добавим еще с пяток переменных: Код:
keyname:=key.txt; Но k1, k2, k3, k4, k5 = 808464432 (30 бит) (2)Так же не понятно почему они идут бесконечным потоком и не заканчиваются? В таком случае я вообще не могу понять как они считываются и вычисляются. Ребят, подскажите пожалуйста, ибо у меня в голове каша!!! |
Цитата:
Цитата:
34028236 69209370 00000000 0000000 00000000 Если запишете так, то при чтении Цитата:
|
Я там программку пример прикрепил, мне б понять почему при конвертации из типа string в тип integer считанные данные изменяются. т.е. строки мемо1 <> строкам мемо2
Притом при каждом новом запуске данные в числовом формате постоянно разные. Помогите пожалуйста разобраться по какому принципу происходит конверт. |
Student00, мой вам совет, почитайте сначала умных книжек для начинающих (ака чайников ;) ), а потом пишите проги... Для преобразования string в integer надо юзать функцию StrToInt.
|
Цитата:
|
Цитата:
|
спасибо
|
Время: 14:17. |
Время: 14:17.
© OSzone.net 2001-