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.
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.
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.
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>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf(“Uso: %s arquivo_entrada arquivo_saida\n”, argv[0]);
return 1;
}
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;
}