Faça um programa que recebe como entrada o nome de um arquivo de entrada e o nome de um arquivo de saída. Cada linha do arquivo de entrada possui colunas de tamanho de 30 caracteres. No arquivo de saída deverá ser escrito o arquivo de entrada de forma inversa. Veja um exemplo:
Arquivo de entrada:
Hoje é dia de prova de AP
A prova está muito fácil
Vou tirar uma boa nota
Arquivo de saída: Aton aob amu rarit uov
Licáf otium átse avorp A
PA ed avorp ed aid é ejoH
A prova está muito fácil
Vou tirar uma boa nota
Licáf otium átse avorp A
PA ed avorp ed aid é ejoH
Passo 1
O programa recebe dois argumentos: o nome do arquivo de entrada e o nome do arquivo de saída. O objetivo é ler todas as linhas do arquivo de entrada (cada uma até 30 caracteres), e depois escrever no arquivo de saída o conteúdo completamente invertido: primeiro a última linha lida, depois a penúltima, e assim até a primeira; e em cada linha inverter também a ordem dos caracteres.
Para fazer isso, vamos usar manipulação de arquivos em C, alocação dinâmica de memória para armazenar as linhas lidas num vetor de strings, e funções de string para medir comprimento e copiar.
Para fazer isso, vamos usar manipulação de arquivos em C, alocação dinâmica de memória para armazenar as linhas lidas num vetor de strings, e funções de string para medir comprimento e copiar.
Passo 2
Abrimos o arquivo de entrada em modo leitura e o de saída em modo escrita; depois, lemos linha a linha usando
fgets
, removemos o caractere de nova linha (\n
) se existir, duplicamos a string e armazenamos num vetor dinâmico (realloc
).Passo 3
Quando chegamos ao fim do arquivo de entrada, iteramos sobre esse vetor de trás para frente. Para cada string, calculamos seu comprimento com
strlen
e escrevemos no arquivo de saída cada caractere em ordem reversa usando fputc
. Entre linhas, escrevemos também um \n
salvo na exata posição.Passo 4
Por fim, liberamos toda a memória alocada (cada string duplicada e o vetor de ponteiros) e fechamos ambos os arquivos.
Segue o código completo em C:
Segue o código completo em C:
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, “Uso: %s <arquivo_entrada> <arquivo_saida>\n”, argv[0]);
return 1;
}
if (argc != 3) {
fprintf(stderr, “Uso: %s <arquivo_entrada> <arquivo_saida>\n”, argv[0]);
return 1;
}
FILE *fin = fopen(argv[1], "r");
if (!fin) {
perror("Erro ao abrir arquivo de entrada");
return 1;
}
FILE *fout = fopen(argv[2], "w");
if (!fout) {
perror("Erro ao abrir arquivo de saída");
fclose(fin);
return 1;
}
char buffer[31];
char **linhas = NULL;
int n = 0;
while (fgets(buffer, sizeof(buffer), fin)) {
buffer[strcspn(buffer, "\n")] = '\0';
linhas = realloc(linhas, (n + 1) * sizeof(char*));
if (!linhas) {
fprintf(stderr, "Falha na alocação de memória\n");
fclose(fin);
fclose(fout);
return 1;
}
linhas[n++] = strdup(buffer);
}
for (int i = n - 1; i >= 0; i--) {
int len = strlen(linhas[i]);
for (int j = len - 1; j >= 0; j--) {
fputc(linhas[i][j], fout);
}
if (i > 0) fputc('\n', fout);
free(linhas[i]);
}
free(linhas);
fclose(fin);
fclose(fout);
return 0;
}