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

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.

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:

Resposta

#include <stdio.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;
}
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;
}

Exercícios relacionados