Чтение Double

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Чтение Double

Сообщение ReMAG » 22.12.2005 (Чт) 0:02

Всем привет!
Тема такая: есть файл, в который записана структура данных. Формат структуры есть. Задача - правильно прочитать данные.

Я делаю
Код: Выделить всё

hFile = FreeFile
Open cFileName For Binary As hFile
cBody = Space(LOF(hFile))
Get hFile, 1, cBody
Close hFile

' для строк
cRes = Mid(cBody, 1, 4)

' для 4-байтовой целой
cTmp = Mid(cBody, 5, 4)
For i = 4 To 1 Step -1
   nRes = 256 * nRes + Asc(Mid(cTmp, i, 1))
Next i

' для 8-байтовой с плавайщей точкой
Dim dRes As Double
cTmp = Mid(cBody, 9, 8)
CopyMemory ByVal VarPtr(dRes), StrPtr(cTmp), 8


Все классно, кроме dRes. В ней появляется все, кроме того, что я ожидал увидеть.
Может, я неправильно применяю CopyMemory?

Вопрос второй. Пробую через ReadFile.
Код: Выделить всё

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Const GENERIC_READ = &H80000000
Private Const FILE_SHARE_READ = &H1
Private Const OPEN_EXISTING = 3
...
nR = CreateFile("c:\1.dat", GENERIC_READ, FILE_SHARE_READ, 0, 0, 0, 0)
...
FormatMessage FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, er, 256, 0
...


CreateFile возвращает -1 (который Invalid Handle), GetLastError() = 0 и FormatMessage, соответственно, "Операция завершена успешно".
После того, как мой обработчик ошибок написал "Не удалось открыть файл. Описание ошибки: Операция завершена успешно.", я выпал в осадок.
Вот так, сплошные глюки :) Короче, помощь нужна...
Никогда не говори "никогда"...

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Re: Чтение Double

Сообщение codemaster » 22.12.2005 (Чт) 0:23

ReMAG писал(а):Всем привет!
Тема такая: есть файл, в который записана структура данных. Формат структуры есть. Задача - правильно прочитать данные.

.


Покажи формат. Сдается все можно сделать гораздо проще 8)
//<-
Mit freundlichen Grüßen
//->

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Re: Чтение Double

Сообщение ReMAG » 22.12.2005 (Чт) 0:29

codemaster писал(а):Покажи формат. Сдается все можно сделать гораздо проще 8)


Буду только рад :)

Код: Выделить всё
struct Header
  {
   char    name[4];
   int       version;
   double level;
  };
Никогда не говори "никогда"...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.12.2005 (Чт) 14:27

Ы :shock:
Это ж как надо не читать мануал...

private type Header
name as string *4
version as long
level as double
end type

dim h as Header
open "file" for binary access read as #1
get #1,,h
close #1
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 22.12.2005 (Чт) 14:35

GSerg писал(а):Ы :shock:
Это ж как надо не читать мануал...


Ну вот - зачем так сразу мордой в тарелку?
Пофлеймить не дал... :cry:

:lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 22.12.2005 (Чт) 15:59

Andrey Fedorov писал(а):
GSerg писал(а):Ы :shock:
Это ж как надо не читать мануал...


Ну вот - зачем так сразу мордой в тарелку?
Пофлеймить не дал... :cry:

:lol:


:oops: Да ладно... виноват - так виноват... За 5 дет не дочитал до этого места в мануале... Ну бывает...
Так или иначе, приношу свою благодарность!
Никогда не говори "никогда"...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 60

    TopList