If (and only if) you know the starting location of the record you want to read (in bytes), you can do random access in the file to find it. Griff already posted one way to do it, I prefer to use the FileStream directly:
FileStream fs = new FileStream("test.dat", FileMode.Open);
try {
int recordStart = some way to get the position of the record;
fs.Position = recordStart;
int recordLength = some way to get the record size;
byte[] buf = new byte[recordLength];
fs.Read(buf, 0, recordLength);
} finally {
fs.Close();
}
Doing that or using the BinaryReader is essentially a matter of style, they do the same job.
If your file is fixed record length, getting recordStart and recordLength is trivial:
const int recordStart = 80;
int recordStart = index * recordLength;
If it's variable length but with a cross reference table, you need to read that table first to get all the record start offsets, and then determine the length either from the table or from the start of a record, if it's specified.
If you don't have pre-knowledge of the record length, you can start and read data until you determine that you've read a complete record (e.g. found a \r\n pair or EOF).
I'm not familiar with Fortran so I don't know what the format of the data you're trying to load is, but it sounds fixed format. It might be worth wrapping the whole record set in a class which keeps the file handling under wraps, either keeping a FileStream open for its whole lifetime or opening and closing it each time a record is requested, depending on your requirements (i.e. file sharing, resource limits, how often records are asked for etc).