Open File in a Directory
BlitzMax Forums/BlitzMax Beginners Area/Open File in a Directory| 
 | ||
| Hi all, I have a function which saves a file using RequestFile, CreateFile, OpenFile, and CloseFile. The file is created correctly, and in the right place with RequestFile and CreateFile, but when I open the file with OpenFile it returns null. Here's the code: 
Function saveFileAs()
Local time:String = CurrentTime$()
Local timeOut:String[] = time.split(":") 
Local timeString$ = timeout[0]+timeout[1]+timeout[2]
	
filter$="Character Files (.chr);All Files:*"
filename$=RequestFile( "Save File As:",filter$,True)
saveFile=CreateFile(filename$)
saveLns=OpenFile(filename$)
WriteLine saveLns,"RPG-X Character Creator Saved Character File"
WriteLine saveLns,"Created on "+CurrentDate$()+" at "+timeString$+"."
WriteLine saveLns,"-------------------------------------------------"
WriteLine saveLns,""
WriteLine saveLns,"Name: "+TextFieldText(characterName)
WriteLine saveLns,"Age: "+TextFieldText(characterAge)
WriteLine saveLns,"Gender: "+SelectedGadgetItem(charGenderComboBox)
CloseFile savedLns 
	
Return 0
End Function 
All help is appreciated - thanks! | 
| 
 | ||
| Don't use OpenFile.  Use WriteFile and ReadFile instead. | 
| 
 | ||
| I tried that... no luck. Same thing happens. | 
| 
 | ||
| Don't know then.  If ReadFile is returning Null, then I'd be 99.99% certain that you've got the file/path wrong. You should post some more code (like, the code where you're trying to read the file - i.e. where the error is). | 
| 
 | ||
| I've fixed it. There was a very simple typo, that's all. Thank you. | 
| 
 | ||
| Well, just so you're aware - if by any chance a file happens to be read-only, it won't open with OpenFile. ;) | 
| 
 | ||
| I knows that. I have another question. I have a biiig file, a config file for something, and I want to edit a certain line which begins with, say, "setup character bind "0"" how do I find that line so I can edit it? | 
| 
 | ||
| Open the file. Read all lines in a list or array. Check all lines: 
local line:string
If line.contains("setup character bind ")
  ' replace line with new one
end if
I dont know about searching for " in a string; may cause problems! Then write the list/array back to file. There is no way to edit something in the middle of a file as far as I know. | 
| 
 | ||
|  I dont know about searching for " in a string; may cause problems!  local line:string
If line.contains("setup character bind ~q0~q")
  ' replace line with new one
end if
 | 
| 
 | ||
| Hmm... so I would store each line of the file in an array, and read each line until I find what I want? That would work, but I'm a bit shaky on how I'd actually go about copying the file into an array, then writing it back out into the file... This help is great; it's very much appreciated :) | 
| 
 | ||
| I prefer a TList for this: 
SuperStrict 
Local filetoread:TStream = OpenFile("test.txt") ' make sure that there is a file with this name!
Local filelist:TList = New TList
' Read from file
While Not Eof(filetoread) ' reading the file to the list
	Local line:String = ReadLine(filetoread) ' read a line
	filelist.AddLast(line) ' add it to the list
Wend
CloseFile(filetoread)
' write list back to file
Local filetowrite:TStream = OpenFile("test.txt")
For Local line:String = EachIn filelist        ' cycle throug the list
	WriteLine (filetowrite, line)		' write line to file
Next
CloseFile(filetowrite) ' Better never forget, Windows opens the same file only a few hundred times :-)
 | 
| 
 | ||
| Alright, I'll try adding the replace code in there as well :) Something like this: 
Local filetoread:TStream = OpenFile("test.txt") ' make sure that there is a file with this name!
Local filelist:TList = New TList
' Read from file
While Not Eof(filetoread) ' reading the file to the list
	Local line:String = ReadLine(filetoread) ' read a line
	filelist.AddLast(line) ' add it to the list
If filelist.line.contains("REPLACE")
filelist.line.contains = "replaced"
end if
Wend
CloseFile(filetoread)
' write list back to file
Local filetowrite:TStream = OpenFile("test.txt")
For Local line:String = EachIn filelist        ' cycle throug the list
	WriteLine (filetowrite, line)		' write line to file
Next
CloseFile(filetowrite) ' Better never forget, Windows opens the same file only a few hundred times :-)
 | 
| 
 | ||
| That will not work. You misuse the string method 'contains'. Just assing a new value to the readed line before storing it in the list: 
SuperStrict
Local filetoread:TStream = OpenFile("test.txt") ' make sure that there is a file with this name!
Local filelist:TList = New TList
' Read from file
While Not Eof(filetoread) ' reading the file to the list
	Local line:String = ReadLine(filetoread) ' read a line
	'
	If line.Contains("REPLACE") ' check for searched string
		line = ("replaced") ' replace readed line with the new line
	End If
        '
	filelist.AddLast(line) ' add it to the list
Wend
CloseFile(filetoread)
' write list back to file
Local filetowrite:TStream = OpenFile("test.txt")
For Local line:String = EachIn filelist        ' cycle throug the list
	WriteLine (filetowrite, line)		' write line to file
Next
CloseFile(filetowrite) ' Better never forget, Windows opens the same file only a few hundred times :-)
 |