Lo primero es entender como trabaja fscanf.
La función fscanf se parece a la función scanf, también tienes algunos de sus "defectos". Uno de esos es que solo lee hasta encontrar un espacio, tabulador, el carácter enter '\n'.... Y esos son los que yo los se, seguro hay más pero de momento ya nos basta con saber que lee hasta el primer espacio y se detiene, lee hasta el siguiente y se detiene, la cosa es que lo hace en la misma linea.
Si con fscanf nos topamos el carácter '\n', entonces el puntero FILE se posiciona a la siguiente linea y repite todo el proceso. Eso todo lo hace hasta encontrar el carácter EOF que generalmente suele ser -1 (Es que no existe números negativos en la tabla asc2 por eso suele ser algún valor negativo ;) ), en el momento que encuentre el EOF se detiene. EOF significa "end of file" o "fin de archivo".
Bueno... Entonces fscanf nos viene de perla por que digamos que nos va partiendo el texto en palabras a las cuales podemos ir modificando y guardando en otro archivo.
Bien... ahora con la ayuda de un par de funciones podemos ajustar la palabra y guardarla en el fichero. Las 2 funciones en cuestión son la que tu ya tienes en tu programa (strchr) y una 2º que es memmove.
La función strchr busca una letra en una palabra y nos devuelve un puntero de donde se encuentra dicha letra, asi podemos sustituir todo lo que vaya adelante de ella. Si tienes baby, me interesa saber donde esta el 'y' entonces strchr nos sirve perfecto, podemos hacer lo que tu ya has echo pero guardando el puntero para después trabajar con el.
Ejemplo:
char *ptr = strchr( palabra,'y') ptr apunta a 'y', digamos que es palabra[3].
Ahora veremos la otra función. XD
la otra es memmove que sencillamente recibe un puntero que indica en una palabra desde donde queremos sustituir un texto. si tengo "baby" le digo que desde la 'y' sustituya por otro texto. Por ejemplo "ies". Es decir es tomar a "baby" pegar la 'i' encima de 'y' y seguir pegando las otras 2 de tras. Si el que quieres pegar encima del 1º es mas pequeño corres el riesgo de que no lo cubra completamente. Veamos como funciona.
Como ya tengo el puntero apuntando a la y gracias a char *ptr = strchr( palabra,'y') hago:
char ies[10] = "ies";
memmove(ptr, ies, 3); //pega 3 letras de la cadena ies y pega de ptr adelante.
Una forma mas compacta seria:
char ies[] = "ies";
memmove( strchr( palabra,'y'), ies, sizeof(ies)/sizeof(ies[0]) );
=D
Ahora solo tendríamos que enviar la palabra devuelta con fprintf XD
Bueno... solo hice para el caso del baby o sea 'y' por "ies", luego tu adapta y lo terminas con lo que aquí explique.
Código C:
Ver original#include <stdio.h>
#include <string.h>
void CorregirPalabras ( FILE *p, char *cadena );
void main() {
char palabra[100] = "";
int fileLine = 1; //iniciamos en la linea 1 del fichero
FILE *ptrentrada, *ptrsalida;
if ( ( ptrentrada
= fopen ( "redaccion.txt", "r" ) ) == NULL
) printf ( "El archivo no puede abrirse\n" );
else {
ptrsalida
= fopen ( "corregido.txt", "w+" );
while ( !feof( ptrentrada
) ) { //fscanf lee hasta un espacio, tabulador o el caracter '\n'.
//Obtiene una palabra para analizarla y aplicar los cambios si requerido.
fscanf ( ptrentrada
, "%s", palabra
);
//Si no hay mas palabras que retocar no llamamos la funcion o repite la ultima palabra en el fichero de salida antes de terminar el programa.
if ( strcmp( palabra
, "") != 0 ){ //Enviamos el fichero donde se guradará y la palabra a efectuar el cambio
CorregirPalabras ( ptrsalida, palabra );
//Obtenemos la posicion del puntero en el fichero. Util para saber si cambiamos de linea
int n
= ftell( ptrentrada
);
//Si se detecta un salto de linea en el fichero de entrada lo aplicamos igual al de salida.
if ( fgetc ( ptrentrada
) == '\n'){ fileLine++;
printf("Entramos en la linea numero %d", fileLine
); }
//formateamos la cadena
}
}
}
}//main
void CorregirPalabras ( FILE *p, char *palabra ) {
//Declarar aqui las terminaciones que serviran de reemplazo
char ies[] = "ies";
//caso para palabras terminadas en "y" que se cambiaran por "ies". Si no termina en "y" pasa directo y la imprime tal cual.
memmove( strchr( palabra
,'y'), ies
, sizeof(ies
)/sizeof(ies
[0]) ); }
//Enviamos la palabra al fichero de salida.
}
El programa tiene bugs pero si lo afinas trabajará bien. Uno de ellos es que por ejemplo cuando encuentre una coma en el fichero de entrada no la crea en el fichero de salida etc etc. Todo depende de cuanto quieras retocarlo.
El cometido es explicarte como funciona las funciones para que te las montes tu a tu gusto.
Espero que sirva de ayuda =)
Suerte