readint problem

BlitzMax Forums/BlitzMax Programming/readint problem

Sanctus(Posted 2007) [#1]
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.


computercoder(Posted 2007) [#2]
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.


grable(Posted 2007) [#3]
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.


Sanctus(Posted 2007) [#4]
is there a way to write binary?


computercoder(Posted 2007) [#5]
Yes. Let me finish the sample for reading text for you first... Then I'll scratch out a sample for Binary.


computercoder(Posted 2007) [#6]
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()



Sanctus(Posted 2007) [#7]
Wow man thx!


computercoder(Posted 2007) [#8]
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 :)