for (; (ch=fgetc(fp)) != '@'; total++)
と
for (; ch=fgetc(fp) != '@'; total++) または for (; (ch=fgetc(fp) != '@'); total++)
で、上ではループのたびにchにfgetcしたものが入っていたのですが、下ではchに入っておらず、ループの条件は正常でした。
なぜ下では代入されないのでしょう?