elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Error en programacion de LZW en: 8 Noviembre 2016, 03:08 am
Buenas,

Me he propuesto programar un compresor LZW que me comprima un archivo llamado "quijote.txt". He programado el algoritmo que creo que deberia funcionar, pero no lo hace. ¿Podrían decirme donde esta el error?.

Código:

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

#define dim1 1000
#define dim2 2000

int main(){

 size_t totCarac = 1000;
 size_t totCarac2 = 2000;
 char *palabras[100000] = {" ","a","b","c","d","e","f","g","h","i","j","k","l","m","n","ñ","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","Ñ","O","P","Q","R","S","T","U","V","W","X","Y","Z","Á","É","Í","Ó","Ú","á","é","í","ó","ú","À","È","Ì","Ò","Ù","à","è","ì","ò","ù","Ä","Ë","Ï","Ö","Ü","ä","ë","ï","ö","ü","!","¡","?","¿","#","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","@","[","]","^","_","`","{","}","ç","|","~","«","»","¬","·","€","$"};
 char P[dim1] = "", C[dim1] = "";
 char *PC = ( char* )malloc( totCarac2 * sizeof(char) );
 int i1,i2,i3,i4,valor1,valor2,indice1,indice2,componente;

  FILE* quijote = NULL;
  FILE* quijotec = NULL;

  quijote = fopen("quijote.txt", "r");
  quijotec = fopen("quijotec.txt", "w");


  fscanf(quijote,"%c",&P);
  fscanf(quijote,"%c",&C);
  componente = 133;

  printf("%c \n",P); <------- este print me da algo que no corresponde con el primer caracter del archivo



  while (!feof(quijote)){

    PC = strcpy(PC,P);
    PC = strcat(PC,C);


    for(i3=1;i3<=100000;i3++){

        valor1 = strcmp(PC,palabras[i3-1]);

        if (valor1 == 0){
            indice1 = i3;
            P2 = strcpy(P,PC);
            goto Palma1;
        }
    }

    palabras[componente] = strcpy(palabras[componente],PC);

    for(i4=1;i4<=100000;i4++){

        valor2 = strcmp(P,palabras[i4-1]);

        if (valor2 == 0){
            indice2 = i3;
            goto Palma2;
        }
    }

    Palma2:

    fprintf(quijotec, "%i ", indice2);
    P2 = strcpy(P,C);
    fscanf("%c",&C);

    Palma1:

      }

    fclose(quijote);
    fclose(quijotec);
    printf("Fin");


  return 0;
  }



Cabe destacar que el documento a comprimir tiene letras, simbolos y espacios en blanco, todos incluidos en el model ASCI.

Gracias por adelantado.
2  Programación / Programación C/C++ / Re: Error en funcion que retorna vectores en C. en: 29 Julio 2016, 12:35 pm
Buenas,

Antes de nada agradecerles sus aportes y el tiempo que han dedicado a mi problema. El caso es que he probado con el fseek y con el rewind pero el problema persiste, incluso quitando la funcion "contarlineas" y dando a lineas un valor fijo, sigue devolviendo ceros.

Les adjunto el codigo nuevo.

Código:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define dim 10
#define dim2 10000

int contarlineas (FILE *datos);
double* vectorizaciont (FILE *datos, int lineas);
double* vectorizacionUV (FILE *datos, int lineas);


int main(){

    int lineas;
    double *t;
    long double *UV;

    FILE* datos = NULL;
datos = fopen("00_10_01_01.00.00_._00_11_30_23.00.00_.txt", "r");

    lineas = contarlineas(datos);

    rewind(datos);

    t = malloc(lineas*sizeof(double));
    UV = malloc(lineas*sizeof(long double));

    t = vectorizaciont(datos,lineas);
    UV = vectorizacionUV(datos,lineas);


 return 0;

}

int contarlineas (FILE *datos){

    int lineas = 0;
    char aux[dim2] = "";

     while (!feof(datos)){

              lineas++;
  fscanf(datos, " %[^\n]", &aux);

    }

    return lineas;

    }

double* vectorizaciont (FILE *datos, int lineas){

    double *t;
    char aux[dim2] = "";
    int i,i2,i3;

    t = malloc(lineas*sizeof(double));

    for (i=1;i<=lineas;i++){

        i2 = i-1;

        for(i3=1;i3<=3;i3++){

            if (i3 == 1){

                fscanf(datos, "%s", &aux);
                free(aux);
            }

            if (i3 == 2){

                fscanf(datos,"%f", &t[i2]);
                printf("t[%i] = %f \n", i2, t[i2]);
            }

            if (i3 == 3){

                fscanf(datos,"%s", &aux);
                free(aux);
            }

        }
    }

    return t;
}

double* vectorizacionUV (FILE *datos, int lineas){

    long double *UV;
    char aux[dim2] = "", aux2[dim2] = "";
    int i,i2,i3;

    UV = malloc(lineas*sizeof(long double));

    for (i=1;i<=lineas;i++){

        i2 = i-1;

        for(i3=1;i3<=3;i3++){

            if (i3 == 1){

                fscanf(datos,"%s", &aux);
                free(aux);
            }

            if (i3 == 2){

                fscanf(datos,"%s", &aux);
                free(aux);
            }

            if (i3 == 3){

                fscanf(datos,"%lf", &aux2);
                printf("UV[%i] = %lf \n", i2, UV[i2]);
            }

        }
    }

    return UV;

}

Gracias por su tiempo.
3  Programación / Programación C/C++ / Re: Crear un array de caracteres mediante una funcion. en: 28 Julio 2016, 19:37 pm
¡Gracias a todos por sus aportes, me han ayudado mucho!
4  Programación / Programación C/C++ / Error en funcion que retorna vectores en C. en: 28 Julio 2016, 19:34 pm
Buenas,

Estoy haciendo un programa que primero me diga cuantas lineas tiene el archivo (se trata de un archivo con tres columnas y alrededor de 300.000 lineas) y luego me cree un vector en el que me escriba los términos de la segunda columna y otro con los términos de la tercera columna (la segunda columna son ints y la tercera long doubles). El problema es que todo funciona correctamente pero cuando le pido que me escriba las componentes de los vectores, me escribe "0" en todas, como si no estuviera leyendo nada. ¿Podrian ayudarme?

Les adjunto el codigo:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. #define dim 10
  6. #define dim2 10000
  7.  
  8. int contarlineas (FILE *datos);
  9. double* vectorizaciont (FILE *datos, int lineas);
  10. double* vectorizacionUV (FILE *datos, int lineas);
  11.  
  12.  
  13. int main(){
  14.  
  15.    int lineas;
  16.    double *t;
  17.    long double *UV;
  18.  
  19.    FILE* datos = NULL;
  20. datos = fopen("00_10_01_01.00.00_._00_11_30_23.00.00_.txt", "r");
  21.  
  22.    lineas = contarlineas(datos);
  23.  
  24.    t = malloc(lineas*sizeof(double));
  25.    UV = malloc(lineas*sizeof(long double));
  26.  
  27.    t = vectorizaciont(datos,lineas);
  28.    UV = vectorizacionUV(datos,lineas);
  29.  
  30.  
  31. return 0;
  32.  
  33. }
  34.  
  35. int contarlineas (FILE *datos){
  36.  
  37.    int lineas = 0;
  38.    char aux[dim2] = "";
  39.  
  40.     while (!feof(datos)){
  41.  
  42.              lineas++;
  43.  fscanf(datos, " %[^\n]", &aux);
  44.  
  45.    }
  46.  
  47.    return lineas;
  48.  
  49.    }
  50.  
  51. double* vectorizaciont (FILE *datos, int lineas){
  52.  
  53.    int *t;
  54.    char aux[dim2] = "";
  55.    int i,i2,i3;
  56.  
  57.    t = malloc(lineas*sizeof(int));
  58.  
  59.    for (i=1;i<=lineas;i++){
  60.  
  61.        i2 = i-1;
  62.  
  63.        for(i3=1;i3<=3;i3++){
  64.  
  65.            if (i3 == 1){
  66.  
  67.                fscanf(datos, "%s", &aux);
  68.            }
  69.  
  70.            if (i3 == 2){
  71.  
  72.                fscanf(datos,"%i", &t[i2]);
  73.                printf("t[%i] = %i \n", i2, t[i2]);
  74.            }
  75.  
  76.            if (i3 == 3){
  77.  
  78.                fscanf(datos,"%s", &aux);
  79.            }
  80.  
  81.        }
  82.    }
  83.  
  84.    return t;
  85. }
  86.  
  87. double* vectorizacionUV (FILE *datos, int lineas){
  88.  
  89.    long double *UV;
  90.    char aux[dim2] = "", aux2[dim2] = "";
  91.    int i,i2,i3;
  92.  
  93.    UV = malloc(lineas*sizeof(long double));
  94.  
  95.    for (i=1;i<=lineas;i++){
  96.  
  97.        i2 = i-1;
  98.  
  99.        for(i3=1;i3<=3;i3++){
  100.  
  101.            if (i3 == 1){
  102.  
  103.                fscanf(datos,"%s", &aux);
  104.            }
  105.  
  106.            if (i3 == 2){
  107.  
  108.                fscanf(datos,"%s", &aux);
  109.            }
  110.  
  111.            if (i3 == 3){
  112.  
  113.                fscanf(datos,"%lf", &aux2);
  114.                printf("UV[%i] = %lf \n", i2, UV[i2]);
  115.            }
  116.  
  117.        }
  118.    }
  119.  
  120.    return UV;
  121.  
  122. }

Gracias por adelantado.


Mod: Los códigos deben ir en etiquetas GeSHi
5  Programación / Programación C/C++ / Re: Problema programacion en C. en: 26 Julio 2016, 13:44 pm
Buenas,

gracias por tu respuesta, lo he solucionado, aunque no se muy bien como. Te paso la funcion final:

double fichero1 (FILE *datos, char* nombre, double juliana1, double juliana2){

   int i,i2;
   char aux[dim2] = "", tc[dim2] = "";
   long double x,y1,y2;
   double z1,z2,t;

   i = 0;
   y2 = 0.0;

   FILE* archivo = NULL;

   archivo = fopen(nombre, "r");

     while (!feof(archivo)){

          i++;

        if (i <= 32){

           fscanf(archivo, " %[^\n]", &aux);
            }

        else{

           for (i2=1;i2<=3;i2++){

              if (i2==1){

                    fscanf(archivo, "%s", &tc);
                    t = atof(tc);
                    z1 = juliana1 - t;
                    z2 = juliana2 - t;
                    if (z2 < 0){
                        goto BCN;
                    }
                    if ((z1 < 0) && (z2 > 0)){

                   fprintf(datos, "%f ", t);
                    }
                  }

                  if (i2==2){

                    fscanf(archivo, "%lf", &y1);
                    if ((z1 < 0) && (z2 > 0)){
               fprintf(datos, "%lf ", y2);
                    }
                  }

              if (i2==3){

                    fscanf(archivo, "%lf", &x);
               if ((z1 < 0) && (z2 > 0)){
               fprintf(datos, "%lf \n", x);
                    }
                  }
             }
          }
       }

    BCN:

    printf("%f \n", t);

    fclose(archivo);

   return t;
}

Gracias por todo.
6  Programación / Programación C/C++ / Problema programacion en C. en: 24 Julio 2016, 15:49 pm
Buenas,

Estoy escribiendo un programa que a partir de dos nombres (en forma de string) y dos numeros, me escriba en un fichero los datos de la primera columna que estan comprendidos entre los dos numeros, en un segundo fichero. El problema que me sale es que al leer el valor de la columna y compararmelo con los limites que le he dado en un princio, me coge el valor cogido de la columna como 0.0, en lugar del valor ha tomado del primer fichero. Por tal de encontrar el error, he escrito una serie de printf y he averiguado que el valor del primer fichero se guarda correctamente en "t" pero luego, a la hora de operar para enconrar "z" o para mirar si esta dentro del intervalo, me utiliza el valor 0.0, y no he conseguido averiguar porque.

Les adjunto el codigo:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define dim 5
#define dim2 10000

void fichero1 (char* nombre, char* nombrefinal, double juliana1, double juliana2);

int main(){

 double juliana1,juliana2;
 char a[dim] = "a.txt",b[dim] = "b.txt";

 juliana1 = 100000000;
 juliana2 = 200000000;


 fichero1(a,b,juliana1,juliana2);


  return 0;

}

void fichero1 (char* nombre, char* nombrefinal, double juliana1, double juliana2){

   int i,i2;
   char aux[dim2] = "";
   long double x,t=0,y1,y2;
   double z;

   y2 = 0.0;

   printf("%f \n", juliana1);
   printf("%f \n", juliana2);

   FILE* archivo = NULL;
   FILE* datos = NULL;

   archivo = fopen(nombre, "r");
   datos = fopen(nombrefinal, "w");

     for (i=1;i<40;i++){

        if (i <= 32){

           fscanf(archivo, " %[^\n]", &aux);
        }

        else{

           for (i2=1;i2<=3;i2++){

              if (i2==1){

                    fscanf(archivo, "%lf", &t);
                   
                    //Ponemos unos printf de prueba.
                   
                    printf("juliana1 = %lf \n", juliana1);
                    printf("t = %lf \n", t); // <-- aqui escribe el valor correcto de t.
                    z = t-juliana1; // <-- aqui, sin embargo, toma t = 0 para calcular z.
                    printf("z = %f \n", z);
                   
                    if (t>juliana2){
                        goto BCN;
                    }
                    if ((t > juliana1) && (t < juliana2)){ // <-- aqui tambien coje t = 0.
                   fprintf(datos, "%lf ", t);
                    }
                  }

                  if (i2==2){

                    fscanf(archivo, "%lf", &y1);
                    if ((t > juliana1) && (t < juliana2)){
               fprintf(datos, "%lf ", y2);
                    }
                  }

              if (i2==3){

                    fscanf(archivo, "%lf", &x);
               if ((t > juliana1) && (t < juliana2)){
               fprintf(datos, "%lf \n", x);
                    }
                  }
             }
          }
       }
    BCN:

   return;
}

Gracias por adelantado.
7  Programación / Programación C/C++ / Re: Crear un array de caracteres mediante una funcion. en: 21 Julio 2016, 11:51 am
Buenas,

He leido lo que me dijiste y me ha servido de mucho, muchas gracias; aunque aun me quedaron aglunos errores y dudas. Te adjunto el nuevo codigo:

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define dim 3

char *nombre1( char *m, char *a );
int main()
{
    char a[dim] = "",m[dim] = "",d[dim] = "",*nombre2 = NULL;
    int l;

    setbuf(stdout, NULL);
    printf( "dame la a: \n");
    fgets(a, dim, stdin);
    limpiarBuffer(a);

    printf( "dame la m: \n");
    fgets(m, dim, stdin);
    limpiarBuffer(m);

    nombre2 = nombre1(m,a);
    printf("\n %s",nombre2);                   <---------------------   (1)
    return 0;
}

char* nombre1(char* m, char* a){
   size_t totCarac = strlen( m ) + strlen( a ) +8;
   char *nombre = ( char* )malloc( totCarac * sizeof(char) );

   nombre = strcat(a,"_");
   nombre = strcat(nombre,m);
   nombre = strcat(nombre,".15.txt");
   printf("\n %s",nombre);                            <-----------------   (2)

   return nombre;

}

void limpiarBuffer( char cadena[] ){
   char *p = NULL;
   size_t ch;

   if((p=strchr(cadena, '\n'))){
      *p='\0';
   }
   else{
      while((ch = getchar()) !='\n' && ch!=EOF);
   }
}


La duda que tengo es referente a la funcion "LimpiarBuffer", es una funcion que copie de uno de los links que me pasaste y que me evita que me salgan ciertos saltos de linea y espacios que yo no le he especificado, pero realmente no entiendo mucho su funcionamiento, si puedieras explicarmelo te lo agradeceria.

A la hora de compilar, es curioso que en el printf que he marcado con un (2) me escribe perfectamente el string que yo quiero crear, de la forma que, suponiendo que a: 55 y m: 66, devuelve  "55_66.15.txt", pero sin embargo, al escribirlo en el printf marcado con un (1) solo escribe "55_) a", y no consigo repararlo.

Gracias por adelantado.
8  Programación / Programación C/C++ / Crear un array de caracteres mediante una funcion. en: 20 Julio 2016, 12:31 pm
Buenas.

Estoy creando un programa que mediante una funcion y a partir de diferentes cadenas de texto me las una y me devuelva una unica cadena. Me da errores varios y esperaba aque me pudieran ayudar. Les paso el código.

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

int main()
{
    char a,m;
    const char* nombre[12];

    a = '96';
    m = '03';

    nombre = nombre1(m,a);
    printf("%s",nombre);
    return 0;
}

const char* nombre1(char m, char a){

   char nombre[12];

   strcat(nombre,a);
   strcat(nombre,"_");
   strcat(nombre,m);
   strcat(nombre,".15.txt");

   return nombre;

}

Gracias por adelantado.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines