Esta es mi idea. No tiene control de errores, sólo funcionalidad básica. Probado bajo Windows, en Linux necesitaría de algunos cambios:
#include <stdio.h>
#include <stdlib.h>
char *arch_original = "original.txt";
char *arch_copia = "copia.txt";
int menu() {
int retval;
puts("1. Copiar a en b tal cual"); puts("2. Copiar a en b pero invirtiendo linea a linea"); puts("3. Copiar a en b pero invirtiendo todo el orden");
return retval;
}
void reiniciar_archivo() {
FILE
*fp
= fopen(arch_original
, "wt");}
void opcion_1() {
int c;
FILE
*original
= fopen(arch_original
, "rt"); FILE
*copia
= fopen(arch_copia
, "wt");
}
}
void opcion_2() {
char buffer[4096];
char c;
int tam;
FILE
*original
= fopen(arch_original
, "rt"); FILE
*copia
= fopen(arch_copia
, "wt");
fscanf(original
, "%4096[^\n]%n", buffer
, &tam
); for(int i=tam-1; i>=0; --i)
if((buffer
[0] = fgetc(original
)) == '\n') else
}
}
void opcion_3() {
int c;
FILE
*original
= fopen(arch_original
, "rt"); FILE
*copia
= fopen(arch_copia
, "wt");
fseek(original
, -1, SEEK_END
);
while(ftell(original
)>1) { fseek(original
, c
=='\n'? -3 : -2, SEEK_CUR
); }
}
int main() {
int n;
do {
reiniciar_archivo();
n = menu();
switch(n) {
case 0:
break;
case 1:
opcion_1();
break;
case 2:
opcion_2();
break;
case 3:
opcion_3();
break;
default:
puts("La opcion elegida no es correcta."); }
// Mira el resultado en el archivo copia.txt
} while(n);
}