Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Programa del reves C

Estas en el tema de Programa del reves C en el foro de C/C++ en Foros del Web. Hola, me encuentro haciendo mi primer programa en C y estoy un poco bloqueado. debo hacer lo siguiente Este programa procesa cada fichero en el ...
  #1 (permalink)  
Antiguo 08/12/2015, 18:31
 
Fecha de Ingreso: diciembre-2015
Mensajes: 6
Antigüedad: 8 años, 4 meses
Puntos: 0
Exclamación Programa del reves C

Hola, me encuentro haciendo mi primer programa en C y estoy un poco bloqueado.

debo hacer lo siguiente

Este programa procesa cada fichero en el orden indicado (o en su defecto, la entrada
estándar) leyendo cada linea del mismo (considerando un máximo de 2048 caracteres por linea)
y emite por su salida estándar dichas leneas previa inversión del contenido de las mismas
contenido idéntico pero ledo de derecha a izquierda.

Esto es lo que hice hasta ahora, no hace lo que me piden pero no se como seguir .
Mi primera duda es, como puedo hacer para pasarle mas de un argumento ? (Por ejemplo dos ficheros de texto.)

Y la segunda duda esta relacionada con el resultado que obtengo al ejecutar mi programa.Cuando ejecuto el programa pasado por argumento un fichero de texto con varias lineas solo me invierte la ultima y no se porque.



Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUFFER 2048


int main(int argc, char *argv[])
{
  int i,j;
  j=0;
  char texto[MAX_BUFFER];
  char reverso[MAX_BUFFER];
  FILE *f;
  f=fopen(argv[1],"r");
  
  
	while (!feof(f)){
	fgets(texto,MAX_BUFFER,f);
   
}

for(i=strlen(texto)-1; i>=0; i--){
    reverso[j]=texto[i];
    j++;
}
 
  printf("%s\n",reverso);

  system("PAUSE");	
  return 0;
}

Gracias por tu tiempo, un saludo.
  #2 (permalink)  
Antiguo 09/12/2015, 03:03
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Programa del reves C

Tienes que acostumbrarte a probar tus códigos con lápiz y papel. Más adelante sería altamente recomendable que aprendieses a utilizar el depurador de código.

Primer problema:

Código c:
Ver original
  1. while (!feof(f)){
  2.   fgets(texto,MAX_BUFFER,f);
  3. }

Se supone que tu programa ha de leer línea a línea... tu programa va a leer la primera línea, después la segunda... en el mismo sitio donde se encontraba la primera... y así. Cuando haya terminado únicamente vas a encontrar en texto el contenido de la última línea. Quizás el while debería abarcar también la función que invierte el texto.

Segundo problema:

Código C:
Ver original
  1. int i,j;
  2.   j=0;
  3.  
  4.   for(i=strlen(texto)-1; i>=0; i--){
  5.     reverso[j]=texto[i];
  6.     j++;
  7.   }

Imagina que consigues que tu programa lea dos líneas "hola" y "adios"
  1. j = 0
  2. i = strlen("hola")-1 = 3
  3. reverso[0] = texto[3]
  4. j = j+1 = 1, i = i-1 = 2
  5. reverso[1] = texto[2]
  6. j = j+1 = 2, i = i-1 = 1
  7. reverso[2] = texto[1]
  8. j = j+1 = 3, i = i-1 = 0
  9. reverso[3] = texto[0]
  10. j = j+1 = 4
  11. i = strlen("adios")-1 = 4
  12. reverso[4] = texto[4]

¿Ves algo raro en el paso 12? Eso pasa por no inicializar j antes de procesar una línea. A nada que pruebes el código con lápiz y papel aprendes a ver estas cosas... aunque, como te he comentado, quitarse el miedo y aprender a usar el depurador de código es de las mejores decisiones que puedes tomar a la hora de programar.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 09/12/2015, 04:17
 
Fecha de Ingreso: diciembre-2015
Mensajes: 6
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: Programa del reves C

Muchas gracias tu respuesta me ha ayudado mucho. Solo me queda una duda por resolver. Como podría hacer para poder ejecutar este programa con 2 argumentos o mas ?
Por ejemplo con dos ficheros de texto y que me devolviera la información de ambos al revés primero la del primer fichero y después la del segundo de la siguiente manera:

Contenido: fich1.txt: hola
adiós

fich2.txt: que
tal

delreves.c fich1.txt fich2.txt

aloh
sóida
euq
lat

Se me ocurre que podría hacerlo de la siguiente manera:


Código:
for(int t=1;t=argc+1;t++){
  FILE *f;
  f=fopen(argv[t],"r");

}
Pondría el código para darle la vuelta al texto dentro del for.

Gracias saludos.
  #4 (permalink)  
Antiguo 09/12/2015, 05:01
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Programa del reves C

Cita:
Iniciado por saomola Ver Mensaje
Se me ocurre que podría hacerlo de la siguiente manera:


Código:
for(int t=1;t=argc+1;t++){
  FILE *f;
  f=fopen(argv[t],"r");

}
argc te indica el número de elementos de argv... y argv contiene la lista de parámetros con la que se ha arrancado la aplicación, siendo argv[0] el nombre del ejecutable.

Esto es importante tenerlo en cuenta porque argv[argc] no apunta a nada válido... te lo comento porque ese "t=argc+1" no está bien:

  • t=argc+1 SIEMPRE va a ser distinto de 0, luego el bucle se va a ejecutar INDEFINIDAMENTE hasta que el programa casque por acceder a menoria no válida
  • Si tu intención era poner t<=argc+1, acabarás intentando leer dos parámetros inexistentes
  • Si tu intención era poner t<argc+1, acabarás intentando leer un parámetro inexistentes
Lo suyo sería


Código C:
Ver original
  1. for(int t=1;t<argc;t++)


Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #5 (permalink)  
Antiguo 09/12/2015, 06:44
 
Fecha de Ingreso: diciembre-2015
Mensajes: 6
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: Programa del reves C

Muchas gracias por tu rápida respuesta. El código funciona aunque aun persiste un algún problema que no consigo resolver.

Ya lee varios argumentos y devuelve el reverso del texto pero aun tengo un problema que no logro entender.

Estos son los argumentos que he utilizado:
fich.txt:(que contiene)
fila uno
fila dos
fila tres

fich1.txt:(que contiene)
fila cuatro
fila cinco
fila seis

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUFFER 2048


int main(int argc, char *argv[])
{
  int i,j,t;
  j=0;
  char texto[MAX_BUFFER];
  char reverso[MAX_BUFFER];
  FILE *f;
  for(t=1;t<argc;t++){
  f=fopen(argv[t],"r");
  
	while (!feof(f)){
	fgets(texto,MAX_BUFFER,f);
        //printf("%s",texto);


		for(i=strlen(texto)-1; i>=0; i--){
    		reverso[j]=texto[i];
    		j++;
	}
}
 
  printf("%s\n",reverso);
  j=0;
}

  system("PAUSE");	
  return 0;
}
el resultado al ejecutar
delreves.c fich.txt fich1.txt
es el siguiente :
sao@ubuntu:~/Desktop/C$ ./a.out fich fich1

onu alif
sod alif
sert alif
sert alif

ortauc alif
ocnic alif
sies alif
sies alif

No comprendía porque imprimía dos veces la ultima fila por lo que introduje un printf en el while para ver si el problema estaba en el while (el printf que se encuentra en forma de comentario). Al hacer esto verifique que en efecto el problema estaba en el while por lo que siguiendo tu consejo lo hice paso a paso para tratar de encontrar mi error, pero en papel el resultado que obtuve fue correcto. Por lo que decidi cambiar la condición del while ya que lo único que se me ocurrio fue que el feof no hiciera lo que pensaba que es indicar el fin del contenido del archivo.

Este fue el cambio que realice.
Código:
while (fgets(texto,MAX_BUFFER,f) !='\0'){
	 fgets(texto,MAX_BUFFER,f);
Lo que pretendía hacer con este cambio es que el bucle se parara cuando encontrara un byte NULL (lo que si no me equivoco correspondería al final del fichero.

Pero ahora al ejecutar no me imprime la primera linea de cada argumento -_-' .

de esta forma:


sod alif
sert alif

ocnic alif
sies alif

Gracias nuevamente por tu tiempo. Un saludo.
  #6 (permalink)  
Antiguo 09/12/2015, 07:34
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Programa del reves C

Es muy importante saber cómo funciona cada función... te lo demuestro en dos minutos:

Código C:
Ver original
  1. while (!feof(f))
  2. {
  3.   fgets(texto,MAX_BUFFER,f);

el flag EOF no se activa hasta que no se produce una lectura errónea. Lo que te está sucediendo es que, una vez has leído la última línea, feof sigue devolviendo 1 porque, técnicamente, no has llegado al final del fichero. Después lanzas una nueva lectura... lectura que va a fallar y va a activar el flag EOF... pero no lo estás comprobando sino que te lanzas a invertir la línea... como la lectura ha fallado, fgets no ha modificado el contenido de texto, por lo que sigue almacenando la última línea de tu fichero.

¿Posibles soluciones? Puedes comprobar feof después de lanzar la lectura:

Código C:
Ver original
  1. while(1)
  2. {
  3.   fgets(texto,MAX_BUFFER,f)
  4.   if( feof(f) )
  5.     break;
  6.  
  7.   // ...
  8. }

Otra opción es comprobar el valor de retorno de fgets. Si la lectura es correcta te devuelve la cadena leída y, si no, un puntero nulo:

Código C:
Ver original
  1. while(!feof(f))
  2. {
  3.   // equivalente a if( fgets(texto,MAX_BUFFER,f) != 0 )
  4.   if( fgets(texto,MAX_BUFFER,f) )
  5.   {
  6.     // ...
  7.   }
  8. }

En este caso comprobarías el flag EOF... como aun no has hecho una lectura incorrecta sigues dentro del bucle. A continuación lanzas una lectura que va a fallar... lo detectas y no haces absolutamente nada, dejas que el bucle intente repetirse... al volver a evaluarse EOF sales del bucle y evitas mostrar dos veces la última línea.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #7 (permalink)  
Antiguo 09/12/2015, 11:08
 
Fecha de Ingreso: diciembre-2015
Mensajes: 6
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: Programa del reves C

Muchas gracias por tu tiempo, el programa ya funciona correctamente =). Estoy intentando modificarlo para que también acepte frases por stdin que no sean ficheros.
A ver que tal me va. Gracias nuevamente saludos.

Etiquetas: char, int, programa, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:25.