readint problem
BlitzMax Forums/BlitzMax Programming/readint problem
| ||
| Hi I have some integers writen in a file. the file looks like this: "64 48 17 206 142 214" I want to read every integer using read int but I get some funky numbers instead of those. Local width:Int = ReadInt(inifile) Local height:Int = ReadInt(inifile) This is a bit of the code used, just to give you an ideea. |
| ||
| ReadInt() is for Binary reads. You are using a Text based file (Ascii). You will need to read them in sequentially and then parse them out based upon the spaces. |
| ||
| It looks the format of your file is TEXT, so ReadInt() and the like wont work. You need to do a ReadLine() feks, and then parse the string yourself. |
| ||
| is there a way to write binary? |
| ||
| Yes. Let me finish the sample for reading text for you first... Then I'll scratch out a sample for Binary. |
| ||
| Sanctus: Here's the code to read text. I added a few things like streams, and arrays, but it should be very easy to follow.
Function Read:String[](file:String)
' Reads a TEXT file then returns a string array
Local i:TStream = ReadFile(file)
Local rawdata:String
Local data:String[]
If Not i = Null Then
If Not Eof(i)
rawdata = ReadLine(i)
data = Split(rawdata , " ")
End If
CloseFile(i)
End If
Return data
End Function
Function Split:String[](source:String, delimiter:String)
' Splits the data apart based on the delimiter specified
Local i:Int
Local array:String[1]
Local value:String
Local arrI:Int = -1
Local temp:String = source
Repeat
i = Instr(temp , delimiter)
arrI :+ 1
array = array[..arrI + 1]
If i > 0 Then
' In string
array[arrI] = Mid(temp , 1 , i - 1)
temp = Mid(temp, i + 1, Len(temp))
Else
' Equal string
array[arrI] = temp
End If
Until i = 0
Return array
End Function
Function Main()
Local intLoop:Int = 0
Local aryData:String[]
Try
Print "Reading from file..."
aryData = Read("test.txt")
Print "Data found, reporting..."
For intLoop = 0 To aryData.Length - 1
Print "Position " + intLoop + ": " + aryData[intLoop]
Next
Catch ex:Object
Print "Error occured: " + ex.ToString()
End Try
End Function
Main()
|
| ||
| Wow man thx! |
| ||
Aight... I finally mustered up the time to squeak this one out for you. This one is a bit advanced, as it uses banks and streams with arrays, BUT... It does read and write binary.
Function ReadBinary:String[](path:String)
Local i:TStream = ReadStream(path)
Local bank:TBank = New TBank
Local bankstream:TBankStream = CreateBankStream(bank)
Local aryData:String[]
Local intI:Int = -1
CopyStream(i, bankstream, StreamSize(i))
CloseStream(i)
SeekStream(bankstream, 0)
While Not Eof(bankstream)
' Read in the binary
intI :+ 1
aryData = aryData[..intI + 1]
aryData[intI] = ReadInt(bankstream)
Wend
CloseStream(bankstream)
Return aryData
End Function
Function WriteBinary(data:String[], path:String)
Local o:TStream = WriteStream(path)
Local intLoop:Int = 0
If Not o = Null Then
' Save the data 1 value per line
For intLoop = 0 To data.Length - 1
WriteInt(o, Int(data[intLoop]))
Next
CloseStream(o)
End If
End Function
Function Split:String[](source:String, delimiter:String)
' Splits the data apart based on the delimiter specified
Local i:Int
Local array:String[1]
Local value:String
Local arrI:Int = -1
Local temp:String = source
Repeat
i = Instr(temp , delimiter)
arrI :+ 1
array = array[..arrI + 1]
If i > 0 Then
' In string
array[arrI] = Mid(temp , 1 , i - 1)
temp = Mid(temp, i + 1, Len(temp))
Else
' Equal string
array[arrI] = temp
End If
Until i = 0
Return array
End Function
Function Main()
Local aryOut:String[] = Split("64 48 17 206 142 214"," ")
Local aryIn:String[]
Local strPath:String = "binarytest.dkm"
Local intLoop:Int = 0
Try
Print "Creating binary file..."
WriteBinary(aryOut, strPath)
Print "Reading binary file created..."
aryIn = ReadBinary(strPath)
Print "Displaying file contents..."
For intLoop = 0 To aryIn.Length - 1
Print "Position " + intLoop + ": " + aryIn[intLoop]
Next
Catch ex:Object
Print "Error occured: " + ex.ToString()
End Try
End Function
Main()
Keep in mind there are OTHER keywords you'll use writing and reading binary: Check out the STREAMS part in BlitzMax help. Hope this helps :) |