@arfneto Consegui fazer com que o código funcione, fazendo tudo o que eu esperava hahahaahahha. Aqui está o resultado:
void ordena (int qntfilmes){
FILE *arquivo = fopen("filmes.txt", "r");
FILE *tmp = fopen ("tmp.txt", "w");
char str [300], temp[300], filmes[qntfilmes][300];
int i, j, cont=0, ret;
fgets (str, 300, arquivo);
while(!feof(arquivo)){
strcpy(filmes[cont], str);
cont++;
fgets (str, 300, arquivo);
}
for (j=0; j<qntfilmes-1; j++){
for (i=j+1; i<qntfilmes; i++){
if (strcmp(filmes[j], filmes[i]) > 0){
strcpy(temp, filmes[j]);
strcpy(filmes[j], filmes[i]);
strcpy(filmes[i], temp);
}
}
}
for (i=0; i<qntfilmes; i++){
fprintf(tmp,"%s", filmes[i]);
}
fclose(tmp);
fclose(arquivo);
remove("filmes.txt");
rename("tmp.txt","filmes.txt");
}
int contfilmes (int cont){
FILE* arquivo = fopen("filmes.txt", "r");
char c, letra = '\n';
cont=0;
while(fread (&c, sizeof(char), 1, arquivo)) {
if(c == letra) {
cont++;
}
}
fclose(arquivo);
return cont;
}
Não consegui utilizar tudo o que vocês me indicaram para que o código ficasse mais eficiente, mas todos os ditos foram de extrema ajuda, muito obrigado!