WriteBit() ja ReadBit()
Author: Jare
Added: 9. huhtikuuta 2011 kello 22.50
Edited: 15. huhtikuuta 2011 kello 22.19
Category: Tiedostot
Description
Kirjoittaa tietoja tiedostoon bitti kerrallaan. Ja tietysti myös lukee. Systeemi kirjoittaa automaattisesti tavuja sille syötettyjen bittien mukaan. Eli tilaa säästyy vain, jos kirjoittaa useita bittejä peräkkäin.
Koodi on kesäkuulta 2009, joten ohjeistus voi nyt jäädä hieman epätäydelliseksi.
1. Kirjoittaessasi tiedostoon, avaa tiedosto OpenToWritellä tai OpenToEditillä.
2. Kirjoita yksittäiset bitit WriteBit()-funktiolla. Jos kirjoitat bitin jälkeen muulla tietotyypillä (muulla kirjoituskomennolla), kutsu välissä FinishWriteBit()-funktiota (ottaa parametrikseen pelkän tiedosto-osoittimen). Kyseinen funktio varmistaa, että kaikki syötetyt bitit on kirjoitettu tiedostoon.
3. Sulje tiedosto CloseFileB()-funktiolla. Tämä kutsuu FinishWriteBit()-funktiota varmuuden vuoksi.
4. Lukiessasi tiedostoa, avaa se OpenToRead-komennolla. Lue bitit ReadBit()-funktiolla.
5. Sulje tiedosto CloseFileB()-funktiolla. Tämä poistaa muistista bittien lukemiseen liittyviä väliaikaisia tietoja.
Code
Select all1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | //Definitions
Const FB_CRASH_ON_ERROR = 1 'This should be 1 (=True) in developing or testing applications AND 0 (=False) in production applications!
Type FileBitDetail
Field id
Field f 'Pointer To file opened by OpenToXXX() Function.
Field binary As String 'Binary value of a Byte. Length varies from 0 To 8.
Field index 'Bit index in current Byte. Used To Read bits.
EndType
//Test program
f = OpenToWrite("temp.txt")
WriteBit(f,1)
WriteBit(f,0)
WriteBit(f,1)
WriteBit(f,0)
WriteBit(f,1)
WriteBit(f,0)
WriteBit(f,1)
WriteBit(f,1)
WriteBit(f,1)
WriteBit(f,0)
WriteBit(f,1)
WriteBit(f,0)
WriteBit(f,1)
WriteBit(f,0)
WriteBit(f,1)
WriteBit(f,0)
FinishWriteBit(f)
CloseFileB(f)
f = OpenToRead("temp.txt")
For i = 1 To 16
stri$ = stri + ReadBit(f)+" "
Next i
CloseFileB(f)
DeleteFile "temp.txt"
MakeError stri
//Public functions
'Functions you need to use are located here.
Function WriteBit(f, b)
If b < 0 Or b > 1 Then
If FB_CRASH_ON_ERROR Then MakeError "WriteBit("+f+", "+b+"): Illegal binary value!" Else Return False
EndIf
fbd_id = GetFileBitDetail(f)
If fbd_id = False Then fbd_id = NewFileBitDetail(f)
fbd.FileBitDetail = ConvertToType(fbd_id)
fbd\binary = fbd\binary + Str(b)
If Len(fbd\binary) = 8 Then Return FinishWriteBit(f) 'Current Byte is full, so Write it To the file
Return True
EndFunction
Function ReadBit(f)
fbd_id = GetFileBitDetail(f)
If fbd_id = False Then fbd_id = NewFileBitDetail(f,Bin(ReadByte(f)))
fbd.FileBitDetail = ConvertToType(fbd_id)
fbd\index = fbd\index + 1
If fbd\index > 8 Then
Delete fbd
Return ReadBit(f) 'Start over; this Byte has been completely Read.
EndIf
Return Int(Mid(fbd\binary, fbd\index,1))
EndFunction
Function FinishWriteBit(f)
fbd_id = GetFileBitDetail(f)
If fbd_id = False Then
If FB_CRASH_ON_ERROR Then MakeError "FinishWriteBit("+f+"): Illegal file pointer!" Else Return False
EndIf
fbd.FileBitDetail = ConvertToType(fbd_id)
If Len(fbd\binary) = 0 Then Return True 'There is nothing To Write so Return And act like succeeded.
WriteByte f, BinToDec(fbd\binary) 'Should Write a value between 0 And 255
fbd\binary = ""
Return True
EndFunction
Function CloseFileB(f)
fbd_id = GetFileBitDetail(f)
If fbd_id = False Then
If FB_CRASH_ON_ERROR Then MakeError "CloseFileB("+f+"): Illegal file pointer!" Else Return False
EndIf
If Not FinishWriteBit(f) Then Return False
fbd.FileBitDetail = ConvertToType(fbd_id)
Delete fbd
CloseFile f
Return True
EndFunction
//Private Functions
'It is not necessary to use these functions outside this library
Function GetFileBitDetail(f)
For fbd.FileBitDetail = Each FileBitDetail
If fbd\f = f Then Return fbd\id 'Found
Next fbd
Return False 'Not found
EndFunction
Function NewFileBitDetail(f,binary="")
fbd.FileBitDetail = New(FileBitDetail)
fbd\id = ConvertToInteger(fbd)
fbd\f = f
fbd\binary = binary
Return fbd\id
EndFunction
//CBSDK functions
'Functions copied from CoolBasic Software Development Kit. The SDK does not currently have a public webpage, so please see http://www.coolbasic.com/phpBB3/ and write word CBSDK to the search engine for more information.
'BinToDec() - copied 20.6.2009 from cbMath.cb @ CBSDK
'Modifications: None
Function BinToDec(jono$) 'by Bagard
For i = Len(jono$) To 1 Step -1
arvo = Int(Mid(jono$, i, 1))
If arvo = 1 Then
luku = luku + 2 ^ (Len(jono$) - i)
EndIf
Next i
Return luku
End Function
|
Comments
No comments. You can be first!
Leave a comment
You must be logged in to comment.