Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jorgemela en 20 Diciembre 2010, 20:33



Título: Ayuda con ejercicio
Publicado por: jorgemela en 20 Diciembre 2010, 20:33
hola, mi nombre es Jorge y soy estudiante de ingenieria informatica, primero decir que soy bastante novato en el tema, alla va el ejercicio:

Este ejercicio trata de realizar un script denominado bocabajo en C que coja un fichero y le de la vuelta de manera que las lineas que habia escritas en él queden la primera la ultima, la segunda la penultima y asi sucesivamente, es decir, un ejemplo seria el siguiente:

cat fich1
uno
dos
tres
cuatro

./bocabajo fich1
cuatro
tres
dos
uno

eso es lo que debe realizar el script, y se supone que hemos de utilizar memoria dinamica, al no saber muy bien como va el tema de memoria dinamica, estoy haciendo el script primero sin utilizar memoria dinamica para ver si consigo hacerlo y me da error de segmentacion, tras un tiempo pensando se me ocurrio que podria crear un array bidimensional(se me olvido mencionar, cada linea de fichero tiene un maximo de 2048 caracteres), y mientras voy leyendo las lineas del fichero, ir guardandolas en este array, y luego imprimir el array desde la ultima posicion hasta la primera, el problema es que no estoy muy familiarizado con arrays bidimensionales y tengo lagunas tambien con punteros, asique aqui adjunto mi codigo de lo que he hecho, y a ver si alguien me puede echar una mano, gracias de antemano :):

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. /////////PROGRAMA PRINCIPAL/////////
  6.  
  7. int main(int argc, char* argv[]){
  8.  
  9.  
  10. //declaracion parametros a usar//
  11. FILE *pm;
  12. char lineafile [2048];
  13. char linea [100][2048];///lo he puesto para un maximo de 100 lineas al no usar memoria dinamica de momento
  14. int n;
  15. int c;
  16. pm = fopen(stdin,"rt");
  17. while(fgets(lineafile,2048,pm)!=NULL){
  18. for(n=0;n<=2048; ++n){
  19. strcpy(linea[n],lineafile);
  20. }
  21. }
  22. for(c=2048;c>=0;--c){
  23. printf("%s\n",linea[c]);
  24. }
  25. fclose(pm);
  26. }

he probado con el debuger y me da que el fallo de segmentacion esta en el fgets, y he cambiado tambien algo el programa para quitarme del medio el for de dentro del while, ha quedado asi, pero nose como quitar el error de segmentacion ese la verdad:

Código
  1. /////////LIBRERIAS DECLARADAS PARA USAR STRINGS Y COMANDOS ESPECIFICOS DE STRINGS Y PARA SACAR POR PANTALLA/////////
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. ////////FUNCION BOCABAJO//////////
  6.  
  7. /*void bocabajo(FILE *pm){
  8. }*/
  9.  
  10. /////////PROGRAMA PRINCIPAL/////////
  11.  
  12. int main(int argc, char* argv[]){
  13.  
  14.  /////////FUNCIONACA//////////
  15.  
  16. //declaracion parametros a usar//
  17. FILE *pm;
  18. //int args;
  19. char lineafile[2048];
  20. int contador=0;
  21. char linea [100][2048];
  22. int n;
  23. int c;
  24.  
  25. pm = fopen(stdin,"rt");
  26. while(fgets(lineafile,2048,pm)!=NULL){
  27. strcpy(linea[contador],lineafile);
  28. contador++;
  29. }
  30. for(c=contador;c>=0;--c){
  31. printf("%s\n",linea[c]);
  32. }
  33. fclose(pm);
  34. }

Lh: Utiliza las etiquetas GeSHi para poner código y no hagas doble post, utiliza el botón modificar.


Título: Re: Ayuda con ejercicio
Publicado por: diskontrol en 21 Diciembre 2010, 01:12
Citar
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/////////PROGRAMA PRINCIPAL/////////

int main(int argc, char* argv[]){



FILE *pm;
char lineafile [2048];
char linea [100][2048];
int n;
int c;
pm = fopen(stdin,"rt"); // aquí tienes que abrir fich1, rt es un parámetro válido para fopen?
while(fgets(lineafile,2048,pm)!=NULL){ // el while hace el bucle un numero de veces = a las lineas
for(n=0;n<=2048; ++n){                        // por lo que el bucle for se ejecuta siempre 2048 * 4, además
strcpy(linea[n],lineafile);                      // únicamente tienes 100 lineas no 2048...
}
}
for(c=2048;c>=0;--c){                   //lo mismo en el número de lineas la matriz tiene 100
printf("%s\n",linea[c]);                  //sin embargo solo de debe ejecutar el número de lineas copiadas
}
fclose(pm);
}


Por lo que quedaría más o menos así

Citar
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/////////PROGRAMA PRINCIPAL/////////

int
main ()
{

  FILE *pm;
  char lineafile[2048];
  char linea[100][2048];   
  int n = 0;
  int c;
  pm = fopen ("fich1", "rt");
  while (fgets (lineafile, 2048, pm) != NULL) //así el bucle se ejecuta únicamente el número de veces
    {                                                               //que copia linea
      strcpy (linea[n], lineafile);
      n++;                                                      /en n contamos el número de lineas
    }
  fclose (pm);
  for (c = n; c >= 0; c--)                           //así podemos imprimir únicamente lo necesario
    {
      printf ("%s", linea[c]);
    }
return 0;}



Espero haberte sido de ayuda, a ver que tal se te da implementarlo con memoria dinámica.


Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.


Título: Re: Ayuda con ejercicio
Publicado por: jorgemela en 21 Diciembre 2010, 01:42
muchas gracias diskontrol, pero al final acabe solucionandolo solo, ejecuté el debuger y daba error al meter en el fopen el stdin, y con razon, ya que el stdin es un tipo string, y lo que tiene  que ir en ese lugar en el fopen, debe ser un fichero, asi que lo corregi y puse un bucle para los argumetos y ya me lo hace todo perfecto, muchas gracias, ahora me toca hacerlo con memoria dinamica.