Because the compiler gets as confused about your code as the human reader? [shudder]
Spaces and line breaks are for free, and add nicely to readability.
while ( ( (long)( 1000 * ratio * ( (long)clock() - (long)t0 ) ) % 100 ) / 1000 ) < Data_Read_Rate );
You could do away with the (long) casts of clock() and t0, too (assuming they're both int ). Casting them before substraction won't change the result. To make the whole calculation in long, it'd be sufficient to make one of the arguments long - and the shortest way to do that is casting the literal 1000:
while ( ( ( 1000l * ratio * ( clock() - t0 ) ) % 100 ) / 1000 ) < Data_Read_Rate );
Hmmm... wait. You take something, modulo 100 (yielding a number between 0 and 99), and then divide by 1000? Your result is always 0...
Oh, and you forgot to match your parenthesis. ;-)