Como colocar saída de arquivo EOF em C

O algoritmo funciona , mas não consigo implementar/pensar em como coloco essa saída EOF pedida no exercício , será que alguém poderia me dar uma ajuda?

Segue o problema

Depois de um belo dia de aula é função das vans levarem os estudantes para suas respectivas casas. Mas o que muitos não sabem é que além dos gastos e manutenção da van o motorista precisa ter uma rota para entregar os passageiros em suas casas. Como você é o menino(a) da informática, ele pediu sua ajuda para desenvolver essa rota ordenando os alunos pela distância(da menor para a maior), pela região (em ordem alfabética) e por último pelo nome.

Entrada

Ele te dá a quantidade Q de alunos que não faltaram, o nome do aluno A e uma sigla para a região onde ele mora S (“L” Leste, “N” Norte, “O” Oeste, “S” Sul), e C que representa o custo da entrada da cidade até sua casa. A saída dos casos será (EOF).

https://www.urionlinejudge.com.br/judge/pt/problems/view/2693 -> link para a questão

Implementação :

#include <stdio.h>

#include<string.h>

#define Tam 1000

typedef struct Aluno{

    char nome[30];

    char sigla[1];

    int dist;

} aluno;

void insertion_nome(aluno v[Tam],int tam,aluno a,aluno b){

    aluno aux;

    int i;

    for(i=0;i<tam;i++){

        if(strcmp(a.sigla , v[i].sigla) ==0 && strcmp(a.nome , v[i].nome)==0 && a.dist == v[i].dist) {

            break;

        }

    }

    if(strcmp(a.nome ,b.nome)>0){

        aux=a;

        v[i]=b;

        v[i+1]=aux;

    }

}

void insertion_sigla(aluno v[Tam],int tam ,aluno a,aluno b){

    aluno aux;

    int i;

    for(i=0;i<tam;i++){

        if(strcmp(a.sigla , v[i].sigla) ==0 && strcmp(a.nome , v[i].nome)==0 && a.dist == v[i].dist) {

            break;

        }

    }

    if(strcmp(a.sigla ,b.sigla)>0){

        aux=a;

        v[i]=b;

        v[i+1]=aux;

    }

    else if(strcmp(a.sigla ,b.sigla)==0){

        insertion_nome(v,tam,a,b);

    }

}

void insertion_dist(aluno v[Tam],int tam){

    aluno aux;

    int i,j;

    for(i = 1; i<tam ; i++){

        aux = v[i];

        if(v[i-1].dist != aux.dist){

            for (j = i-1; j >=0 && v[j].dist > aux.dist; j-- ){

                v[j+1]= v[j];

                v[j]=aux;         
            }

        }

        else{

            insertion_sigla(v,tam,v[i-1],aux);

        }

    }

}

int main(){

    aluno x[Tam];

    int n_faltaram,i;

    
    printf("Quantos alunos nao faltaram ?");

    scanf("%d", &n_faltaram);

    /*if(n_faltaram != EOF){ parte do EOF , como disse não sei se isso está correto

        putc (n_faltaram, stdout);

    }

    else{

        printf ("\nO arquivo terminou!");

    } */

    for (i = 0; i < n_faltaram; i++){

        printf("Nome do aluno: \n");

        setbuf(stdin, NULL);

        scanf("%s", x[i].nome);


        printf("Sigla: \n");

        setbuf(stdin, NULL);

        scanf("%s", x[i].sigla);

        printf("Distancia: \n");

        scanf("%d", &x[i].dist);

    }

    insertion_dist(x, n_faltaram);

   

    for (i = 0; i < n_faltaram; i++){

        printf("\n%s",x[i].nome);

    }

   return 0;

}

EOF:

while( scanf("%d", &n_faltaram) != EOF ) {
    // Faz o que você tem que fazer
}

O pulo do gato da questão é que podem existir mais de um conjunto de testes por entrada. Uma solução seria:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char nome[100];
    char regiao;
    long long custo;
} Aluno;

int comparador( const void *um, const void *outro ) {

    Aluno *aUm = (Aluno*) um;
    Aluno *aOutro = (Aluno*) outro;

    if ( aUm->custo < aOutro->custo ) {
        return -1;
    } else if ( aUm->custo > aOutro->custo ) {
        return 1;
    } else if ( aUm->regiao < aOutro->regiao ) {
        return -1;
    } else if ( aUm->regiao > aOutro->regiao ) {
        return 1;
    } else {
        return strcmp( aUm->nome, aOutro->nome );
    }

}

int main() {

    int q;
    Aluno *alunos;

    while ( scanf( "%d", &q ) == 1 ) {

        alunos = (Aluno*) malloc( sizeof( Aluno ) * q );

        for ( int i = 0; i < q; i++ ) {
            scanf( " %s %c %lli",
                  alunos[i].nome,
                  &alunos[i].regiao,
                  &alunos[i].custo );
        }

        qsort( alunos, q, sizeof( Aluno ), comparador );

        for ( int i = 0; i < q; i++ ) {
            printf( "%s\n", alunos[i].nome );
        }

        free( alunos );

    }

    return 0;

}

Não estou conseguindo entender quando o looping do fim do arquivo desse EOF termina, pq quando executo o código fica pedindo os aluno meio que infinitamente .

Modifiquei a main do código lá em cima e ficou assim:

int main(){

    aluno x[Tam];

    int n_faltaram,i;


    while( scanf("%d", &n_faltaram) != EOF ) {

        for (i = 0; i < n_faltaram; i++){

            scanf("%s %s %d", x[i].nome,
                              x[i].sigla,
                             &x[i].dist);

        }

        insertion_dist(x, n_faltaram);

        for (i = 0; i < n_faltaram; i++){

            printf("%s\n",x[i].nome);

        }

    }

   return 0;

}

O que é EOF:

Na computação, EOF ou fim de arquivo (em inglês: end-of-file ), é uma condição do sistema operacional de um computador, atingida quando não há mais dados a serem lidos da “origem dos dados”. Normalmente a origem dos dados é um arquivo ou stream.

Para sinalizar o final de arquivo pelo terminal tenta fazer assim:

  • Sistema do tipo Unix: Ctrl D seguido do enter.
  • No Windows Ctrl z seguido do enter.

Achei esse resposta aqui: Stack Overflow EOF


Se não conseguir parar o loop pelo terminal, não se preocupe que quando seu código for executado pelo URI ele vai funcionar certinho. Isso se você definiu a condição corretamente.