Faça um programa que receba o nome de um arquivo de entrada e outro de saída. O arquivo de entrada contém em cada linha o nome de uma cidade (ocupando 40 caracteres) e o seu número de habitantes. O programa deverá ler o arquivo de entrada e gerar um arquivo de saída onde aparece o nome da cidade mais populosa seguida pelo seu número de habitantes.

Passo 1

O programa precisa ler um arquivo onde cada linha tem 40 caracteres fixos para o nome da cidade e, em seguida, um inteiro com o número de habitantes. Em seguida, deve descobrir qual cidade tem a maior população e gravar no arquivo de saída o nome dessa cidade e sua população.
Vamos usar operações básicas de arquivo em C: fopen para abrir, fscanf ou fgets para ler, comparar valores inteiros para achar o máximo e fprintf para gravar.

Passo 2

Abra o arquivo de entrada em modo leitura e o de saída em modo escrita. Teste se fopen retornou NULL para evitar crash caso o arquivo não exista ou não possa ser aberto.

Passo 3

Inicialize um buffer char city[41] para ler o nome (coloque o caractere nulo no final) e duas variáveis int, uma pop para a população lida e outra max_pop, inicializada com valor menor que zero. Guarde também um buffer max_city[41] para memorizar a cidade mais populosa.

Passo 4

Enquanto não chegar ao fim do arquivo de entrada, leia 40 caracteres para city e depois a população pop. Após a leitura, coloque city[40]=’\0’ e faça um trim à direita para remover espaços extras.
A cada leitura compare pop com max_pop. Se pop for maior, copie city para max_city e atribua pop a max_pop.

Passo 5

Depois do loop, escreva no arquivo de saída uma linha com max_city seguida de um espaço e max_pop.
Feche ambos os arquivos com fclose.
Assim encerramos o programa.

Passo 6

O trecho de código em C abaixo implementa completamente essa lógica.

Resposta

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf(“Uso: %s arquivo_entrada arquivo_saida\n”, argv[0]);
return 1;
}
FILE *fp_in = fopen(argv[1], "r");
if (!fp_in) {
    perror("Erro ao abrir arquivo de entrada");
    return 1;
}

FILE *fp_out = fopen(argv[2], "w");
if (!fp_out) {
    perror("Erro ao abrir arquivo de saída");
    fclose(fp_in);
    return 1;
}

char city[41];
char max_city[41] = "";
int pop;
int max_pop = -1;

while (1) {
    // Lê 40 caracteres para o nome da cidade
    if (fread(city, 1, 40, fp_in) != 40) break;
    city[40] = '\0';

    // Lê a população e descarta o fim de linha
    if (fscanf(fp_in, "%d", &pop) != 1) break;
    // Consome o '\n' após o número, se houver
    fgetc(fp_in);

    // Remove espaços à direita
    for (int i = 39; i >= 0; --i) {
        if (city[i] == ' ') city[i] = '\0';
        else break;
    }

    if (pop > max_pop) {
        max_pop = pop;
        strcpy(max_city, city);
    }
}

if (max_pop >= 0) {
    fprintf(fp_out, "%s %d\n", max_city, max_pop);
}

fclose(fp_in);
fclose(fp_out);
return 0;
}

Exercícios relacionados