Asesoria

Buen día, mi pregunta es la siguiente, tengo que hacer un programa que lea 2 cadenas. La primera es el nombre de un archivo, en este caso "prueba.txt"
La segunda es una palabra que este dentro del archivo.
El programa debe de eliminar todas las ocurrencias de la palabra de la segunda cadena en el archivo.
Por ejemplo si es archivo contiene:
Anita lava la tina
Amor a Roma
Tres tristes triges
tragaban trigo
en un trigral
Dabale arroz a la zorra el Abad
Y si la palabra de la segunda cadena es "tr" el archivo quedaría así
Anita lava la tina
Amor a Roma
Tres istes iges
agaban igo
en un igral
Dabale arroz a la zorra el Abad
Este es mi programa, me muestra el contenido del archivo pero la 2a parte solo me escribe el texto que le agregue y lo hace al inicio, por ejemplo con el texto de arriba si es la 2a cadena escribo "tr" me pone "trita lava la tina....
Podrías decirme que esta mal o que le falta? Gracias.
Mi mail es (xxxxxx)gracias y saludos
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *archivo;
char caracter;
archivo = fopen("prueba.txt","r+");
if (archivo == NULL)
{
printf("\nError de apertura no se encuentra el archivo. \n\n");
}
else
{
printf("\nEl contenido del archivo de prueba es \n\n");
while (feof(archivo) == 0)
{
caracter = fgetc(archivo);
printf("%c",caracter);
}
FILE *fp;
char caracter;
fp = fopen ( "prueba.txt", "r+" );
printf("\nIntrouce la cadena a eliminar: ");
while((caracter = getchar()) != '\n')
{
printf("%c", fputc(caracter, fp));
}
fclose ( fp );
}
system("pause");
}
Respuesta
-1
Ya revise el codigo y no se este completo o estas omitiendo algunos detalles, pero te los comentare de todas formas:
En la primera parte no necesitas abrirlo con r+ ya que solo lo estas leyendo, es decir con un r estaria bien y despues de ponerlo en pantalla lo cierras, si quieres dejarlo con r+ no necesitas hacer la segunda declaracion del archivo ( FILE *fp)
La segunda parte despues de declarar FILE *fp, ahi si necesitas abrirlo como r+, por que vas a modificar, pero lo que haces es solo insertar lo que tiene la variable caracter en el archivo, por eso solo lo pone una vez, por que es lo que le estas indicando.
Fputc = Esta función escribe el carácter indicado por caracter (convertido a un unsigned char) al stream de salida apuntado por fp, en la posición indicada por el indicador de posición de ficheros asociado al fp (es decir al inicio del archivo), y avanza el indicador apropiadamente. Si el fichero no soporta peticiones de posición, o si el stream fue abierto con el modo de añado, el carácter es añadido al fp de salida. Es decir, le mandas el apuntador al inicio del archivo, y ahi es donde escribe la cadena que esta en caracter.
Necesitas recorrer el archivo y comparar la cadena para ver si es igual a caracter y remplazar, por que la funcion fputc no busca y remplaza, solo escribe donde le indiques. Necesitas recorrer el archivo, en el codigo que envias no hay ninguna instruccion donde hagas el comparativo de lo que tiene el archivo con el caracter.
Espero que esto te ayude a entender un poco lo que estas haciendo, recorre el archivo mas o menos asi como cuando lo lees para mostrarlo en pantalla pero compara y si es igual a la cadena que escribiste, remplaza.

3 respuestas más de otros expertos

Respuesta
-1
int main(void)
{
FILE *archivo;
char caracter;
archivo = fopen(&quot;prueba.txt&quot;,&quot;r+&quot;); abres el archivo
if (archivo == NULL)
{
printf(&quot;\nError de apertura no se encuentra el archivo. \n\n&quot;);
}
else
{
printf(&quot;\nEl contenido del archivo de prueba es \n\n&quot;);
while (feof(archivo) == 0)
{
caracter = fgetc(archivo);
printf(&quot;%c&quot;,caracter); el archivo caracter por caracter
}
FILE *fp;
char caracter;
fp = fopen ( &quot;prueba.txt&quot;, &quot;r+&quot; ); Ahora abres el archivo nuevamente con otro apuntador
printf(&quot;\nIntrouce la cadena a eliminar: &quot;);
while((caracter = getchar()) != &#39;\n&#39;) Capturas un caracter del teclado
{
printf(&quot;%c&quot;, fputc(caracter, fp)); Guardas el caracter que capturaste en el archivo
}
fclose ( fp );
}
system(&quot;pause&quot;);
}
Cada vez que abres el archivo el apuntador queda colocado al inicio del archivo. Es decir, apunta al primer caracter, por eso es que la cadena que capturas queda guardada al inicio del archivo.
Para eliminar la cadena tr, primero debes encontrarla y una vez que la encuentras borrarla.
Procura abrir el archivo solo con un apuntador y una sola vez en el programa !
Bueno, entonces lo que hay que hacer es>
Capturas la cadena del teclado y la guardas por ejemplo así:
...
char *cad; int n;
gets(cad);
n=strlen(cad); si no conoces esta funcion, checa este sitio
http://c.conclase.net/librerias/?ansifun=strlen#inicio
...
Luego, después de abrir el archivo, lo recorres checando caracter por caracter para ver si es el que quieres, podría se así:
....
while(feof(archivo) == 0)
{
i=0;
while(cad==fgetc(archivo)&&i<=n)
i++;
if(i==n) si esta condición se cumple quiere decir que encontraste la cadena y entonces:
{
Regresas el apuntador *archivo n caracteres y borras los n caracteres
}
}
Respuesta
-1
Que tal disculpa por la dmeora he andado ocupado y medio enfermo, bueno mira te dejo un codigo que reemplaza como quieres lo hice bastante sencillo, solo falta que a la cadena reemplazada la escribas en un txt, no es complejo y no es la mejor porfa pero para salir de apuros te ha de servir y por cierto esta pregunta era que la formules en c++ no en c#, bueno no importa saludos y suerte
#include
&quot;stdafx.h&quot;
#include
<stdio.h>
#include
<stdlib.h>
#include
<iostream>
#include
<string>
using
namespace std;
void
reemplazar (string cadenaLeida, int longitud,char buscar[10], int peso)
{
string cadenaFinal =
&quot;&quot;;
int i=0;
for(i=0;i<peso;i++)
{
switch(longitud)
{
case 1:
if(cadenaLeida!=buscar[0])
cadenaFinal+=cadenaLeida;
break;
case 2:
if(cadenaLeida==buscar[0])
{
if(cadenaLeida[i+1]!=buscar[1])
cadenaFinal+=cadenaLeida;
else
i+=1;
}
else
cadenaFinal+=cadenaLeida;
break;
case 3:
if(cadenaLeida==buscar[0])
{
if(cadenaLeida[i+1]==buscar[1])
if(cadenaLeida[i+2]!=buscar[2])
cadenaFinal+=cadenaLeida;
else
i+=2;
else
cadenaFinal+=cadenaLeida;
}
else
cadenaFinal+=cadenaLeida;
break;
}
}
if(cadenaFinal.length()>0)
{
//Escribir archivo nuevo de txt de la cadena reemplazada
//osea tienes que borrar el antiguo y crear uno nuevo
}
}
int
_tmain()
{
FILE *archivo;
FILE *archivoImprimir;
string cadenaLeida=
&quot;&quot;;
archivo = fopen (
&quot;C:/PRUEBA.txt&quot;, &quot;r+&quot; );
if (archivo == NULL)
{
printf(
&quot;\nError de apertura no se encuentra el archivo. \n\n&quot;);
}
else
{
printf(
&quot;\nEl contenido del archivo de prueba es \n\n&quot;);
while (feof(archivo) == 0)
{
char caracter = fgetc(archivo);
cadenaLeida += caracter;
}
archivoImprimir = fopen (
&quot;C:/PRUEBA.txt&quot;, &quot;r+&quot; );
while (feof(archivoImprimir) == 0)
{
char caracter = fgetc(archivoImprimir);
printf(
&quot;%c&quot;,caracter);
}
printf(
&quot;\n\nEscriba el texto a reemplazar: &quot;);
//Lee la cadena ingresada
char buscar[10];
fgets (buscar, 10, stdin);
//char buscar = scanf(&quot;%c&quot;);
printf (
&quot;\n&quot;);
int longitud =strlen (buscar)-1;
int peso = cadenaLeida.length();
reemplazar(cadenaLeida,longitud,buscar,peso);
//fscanf(archivo, &quot;%s&quot; ,cadenaLeida);
//printf(&quot;%s&quot;,cadenaLeida);
//fclose ( archivo );
}
system(
&quot;pause&quot;);
}
Respuesta
-1
Tu programa no hace nada de lo que dices. Solamente muestra el contenido del fichero y después hace una cosa muy rara.
La clave está en estas líneas de código:
printf(&quot;\nIntrouce la cadena a eliminar: &quot;);
while((caracter = getchar()) != &#39;\n&#39;)
{
printf(&quot;%c&quot;, fputc(caracter, fp));
}
Lo que estás haciendo es:
->Mientras el caracter leído DEL TECLADO no sea \n:
->->Escribes ese caracter en el fichero machando lo que tenga
Es decir, tu programa no es que tenga ningún fallo, es que no hace nada ni parecido a lo que pretendes.
Lo siento.
Saluds

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas