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

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


  Mostrar Mensajes
Páginas: 1 ... 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [33] 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 ... 161
321  Programación / Programación C/C++ / Re: Problema para continuar un programa con ficheros en: 30 Septiembre 2018, 21:42 pm
Esta es mi idea. No tiene control de errores, sólo funcionalidad básica. Probado bajo Windows, en Linux necesitaría de algunos cambios:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char *arch_original = "original.txt";
  5. char *arch_copia = "copia.txt";
  6.  
  7. int menu() {
  8.    int retval;
  9.  
  10.    puts("1. Copiar a en b tal cual");
  11.    puts("2. Copiar a en b pero invirtiendo linea a linea");
  12.    puts("3. Copiar a en b pero invirtiendo todo el orden");
  13.    puts("0. Salir");
  14.    puts("");
  15.    printf("Eleccion: ");
  16.    scanf("%d", &retval);
  17.  
  18.    return retval;
  19. }
  20.  
  21. void reiniciar_archivo() {
  22.    FILE *fp = fopen(arch_original, "wt");
  23.    fprintf(fp, "12345\nabcde");
  24.    fclose(fp);
  25. }
  26.  
  27. void opcion_1() {
  28.    int c;
  29.    FILE *original = fopen(arch_original, "rt");
  30.    FILE *copia = fopen(arch_copia, "wt");
  31.  
  32.    c = fgetc(original);
  33.    while(!feof(original)) {
  34.        fputc(c, copia);
  35.        c = fgetc(original);
  36.    }
  37.  
  38.    fclose(original);
  39.    fclose(copia);
  40. }
  41.  
  42. void opcion_2() {
  43.    char buffer[4096];
  44.    char c;
  45.    int tam;
  46.    FILE *original = fopen(arch_original, "rt");
  47.    FILE *copia = fopen(arch_copia, "wt");
  48.  
  49.    c = fgetc(original);
  50.    while(!feof(original)) {
  51.        ungetc(c, original);
  52.  
  53.        fscanf(original, "%4096[^\n]%n", buffer, &tam);
  54.        for(int i=tam-1; i>=0; --i)
  55.            fputc(buffer[i], copia);
  56.  
  57.        if((buffer[0] = fgetc(original)) == '\n')
  58.            fputc(buffer[0], copia);
  59.        else
  60.            ungetc(buffer[0], original);
  61.  
  62.        c = fgetc(original);
  63.    }
  64.  
  65.    fclose(original);
  66.    fclose(copia);
  67. }
  68.  
  69. void opcion_3() {
  70.    int c;
  71.    FILE *original = fopen(arch_original, "rt");
  72.    FILE *copia = fopen(arch_copia, "wt");
  73.  
  74.    fseek(original, -1, SEEK_END);
  75.  
  76.    c = fgetc(original);
  77.    while(ftell(original)>1) {
  78.        fputc(c, copia);
  79.        fseek(original, c=='\n'? -3 : -2, SEEK_CUR);
  80.        c = fgetc(original);
  81.    }
  82.    fputc(c, copia);
  83.  
  84.    fclose(original);
  85.    fclose(copia);
  86. }
  87.  
  88. int main() {
  89.    int n;
  90.  
  91.    do {
  92.        reiniciar_archivo();
  93.        n = menu();
  94.  
  95.        switch(n) {
  96.        case 0:
  97.            break;
  98.        case 1:
  99.            opcion_1();
  100.            break;
  101.        case 2:
  102.            opcion_2();
  103.            break;
  104.        case 3:
  105.            opcion_3();
  106.            break;
  107.        default:
  108.            puts("La opcion elegida no es correcta.");
  109.        }
  110.  
  111.        // Mira el resultado en el archivo copia.txt
  112.  
  113.    } while(n);
  114. }
322  Programación / Programación C/C++ / Re: Lista circular simple de enteros con 1 puntero en: 29 Septiembre 2018, 23:43 pm
Debes saber que los métodos recursivos gastan mas memoria que los iterativos. Cada vez que se llama la función recursiva crea un marco en el stack. Cuánta más veces se repita y cuántas más variables locales use más rápido llenará la memoria del programa.
Por esta razón una función recursiva es mas lenta ya que debe generar todo el marco, cambiar los registros del procesador para que apunten a la nueva memoria, copiar los datos de los argumentos de la función, ejecutar una instrucción de salto (que en el peor de los casos, si el predictor del procesador ha fallado, debe cargar de nuevo el IP y saltar a esa instrucción; es el doble de lento). De igual forma cuándo la función termina se debe limpiar la pila y saltar a la instrucción que hay después de la llamada.

Con métodos iterativos todo esto te lo saltar y sólo suele haber una instrucción de comparación y otra de salto.

Por tanto sólo se deben usar métodos recursivos cuando haya una clara ventaja de éstos sobre los iterativos.
323  Programación / Programación C/C++ / Re: Por que el bucle funciona mal?? - C en: 28 Septiembre 2018, 17:43 pm
Tienes otro fallo aquí:
Código:
while (bucle = 0)
Estás asignando, no comparando.
324  Programación / Programación C/C++ / Re: alguien sabe que error o que le falta a este programa en DEV-C++ en: 28 Septiembre 2018, 00:12 am
Sí, pero qué error marca?
325  Programación / Programación C/C++ / Re: alguien sabe que error o que le falta a este programa en DEV-C++ en: 27 Septiembre 2018, 21:35 pm
Qué le pasa?
326  Programación / Programación C/C++ / Re: Error al compilar, error de linker: Undefined reference to... en: 26 Septiembre 2018, 22:47 pm
torneo.c es una copia de nadadores.c
327  Programación / Programación C/C++ / Re: Error al compilar, error de linker: Undefined reference to... en: 26 Septiembre 2018, 20:29 pm
Y cómo lo compilas?
328  Programación / Programación C/C++ / Re: Metodo para calcular dias transcurridos en: 26 Septiembre 2018, 06:50 am
Puedes aprender que hace cada parte que desconoces aquí: http://c.conclase.net/librerias/index.php?ansilib=time#inicio
329  Programación / Programación C/C++ / Re: Metodo para calcular dias transcurridos en: 25 Septiembre 2018, 22:11 pm
Puedes usar la librería time.h que ya viene preparada para trabajar con fechas y horas. Algo así:

Código
  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. unsigned calcular_dias(struct tm *fecha) {
  5.    double diff;
  6.    struct tm aux = *fecha; // Copio la fecha que me han pasado
  7.  
  8.    aux.tm_mday = 1; // Cambio a dia 1 del mes
  9.    aux.tm_mon = 0; // Cambio al primer mes del año. Los meses empiezan por 0
  10.  
  11.    diff = difftime(mktime(fecha), mktime(&aux)); // Calculo los segundos de diferencia entre las dos fechas
  12.  
  13.    return diff/(60*60*24); // Devuelvo la diferencia en días
  14. }
  15.  
  16. int main() {
  17.    time_t tiempo;
  18.    struct tm *fecha;
  19.  
  20.    tiempo = time(NULL); // Consigo la marca de tiempo actual
  21.    fecha = localtime(&tiempo); // Y la paso a la estrutura que la descompone en fecha/hora
  22.  
  23.    printf("Han pasado %u dias.", calcular_dias(fecha));
  24. }
  25.  
330  Programación / Programación C/C++ / Re: Problema al lanzar el programa en: 25 Septiembre 2018, 17:35 pm
Las variables no son funciones. Si una variable contiene el cálculo de una anterior, esta anterior ya debe tener un dato en ella: no funcionan si les das los datos después.
Páginas: 1 ... 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 [33] 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 ... 161
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines