fread exists (I just didn't comment about it), look in amxmodx/scripting/include/file.inc
I don't think it's well documented in the funcwiki though.
And yeah, for each read_file, core opens the file, scans to the line (a bunch of fgets()), byrefs the requested line and closes the file. write_file is similar (although write_file with a -1 line (append) is fast).