Here are the things I noticed. They could be way off base but it may help you.
At first glance your fps calculations seem fine so I will just skip over that.
Main Program Loop:
Do you calculate the projection matrix every frame? For your program there is no reason to do this. Calculate it once in the beginning and set it before you start your main rendering loop.
Also, do you create your skybox every frame too? When not just put the skybox very far away? Or if this doesn't work, you could just translate the skybox everyframe to coincide with your camera's position. I would not create it every frame from scratch though, quite unnecessary.
File I/O is painfully slow. Why do you open the file every time you draw the terrain? You know that data is never going to change. You need to initialize your own vertex data from the heightmap at initialization time. That why you can just render strips and not have to deal with the file. This will be a big speed up.
Try to remove as many redundant state changes as you can. For instance in your loop you have glEnable(GL_TEXTURE_2D); Well, you only need to enable that one time outside of the loop. The calls are costing you.
Just think about it like this. Just walk through a few iterations by hand. Note what gets set and what doesn't. If you notice that one thing is constantly getting set to the same value (or same function getting called, whatever) then take it outside the loop.