Функция fscanf(f,"%s",
a); считывает на строку, а слово.
Чтобы проверить EOF надо хотя бы что-то прочитать из файла, поэтому feof надо проверять после чтения.
a[30] - маловат буфер, может быть баг, так как fscanf не проверяет выход за пределы массива
Что-то типа такого (не считает последнюю пустую строку)
# include <stdio.h>
# include <string.h>
int main(){
char a[1024];
int a1=0,x=0;
FILE *f;
f=fopen("qwerty","r");
do{*a=0; fgets(a,1023, f);
if (feof(f) && *a == 0) break;
x++;
}while(1);
printf("%d\n",x);
fclose(f);
return 0;
}