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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / Cierre brusco de la consola cuando ejecuto el .exe en: 9 Septiembre 2019, 14:28 pm
Buenas. Hice un programa en C con el DEV-C++ creando un nuevo proyecto en consola y finalmente compilando para que me sacara el .exe del resultado final.

Mi problema es que si ejecuto el programa desde el .exe funciona pero al momento de llegar al final no hace pausa y la consola se cierra sola.
Sin embargo, cuando abro el archivo .dev y compilo y ejecuto (sin haber cambiado nada de codigo, por lo que el .exe resultante es el mismo) la consola no se cierra sola al terminar.

No se a qué se debe este problema. No se si es que falta algún archivo o he hecho algo mal en el proceso de compilar a .exe.. la cuestion es que desde el IDE no se cierra y desde el .exe sí.

Los archivos que tengo en la carpeta del proyecto son:

Makefile.win
programa.c
programa.dev
programa.exe
programa.ico
programa.layout
programa.o
programa_private.h
programa_private.rc
programa_private.res

Gracias!

EDIT: Lo he medio solucionado limpiando el bufer antes de la salida del programa. Lo que no entiendo es por qué es necesario limpiar el bufer para que funcione correctamente el .exe si en el IDE no da problemas... por lo que asumo que algo raro debe haber. Espero respuestas (si es que alguien la sabe)
2  Programación / Programación C/C++ / Hallar directorios con espacios C en: 29 Mayo 2019, 18:27 pm
Hola buenas! Soy nuevo en el foro aunque ya lo he visitado muchas veces para distintos problemas.
La cuestion es que he escrito un codigo en C para poder eliminar los x primeros caracteres de todos los archivos encontrados en una ruta especifica.

El programa funciona con direcciones simples aunque no llega a ser muy robusto porque es para uso propio y me da bastante igual.
El problema ocurre cuando trato de poner (o arrastrar) una dirección que contiene espacios. No me reconoce la ruta y por lo tanto el programa es incapaz de listarme los archivos.
He probado insertando la ruta con comillas o sin, pero sin exito.
Si alguien encuentra el problema le estaré muy agradecido. No encuentro soluciones por la web.
(Apenas llevo meses programando. Solo se C y el tema de directorios y dirent.h no lo conocia)
Estoy en Windows con Dev-c++

Código:
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#define MAXLONG 300

DIR *carpeta;
struct dirent *archivo; //struct propio de la libreria dirent.h. En archivo.d_name almacenará el nombre de archivo.

struct copia{
char nombre[MAXLONG];
};

int validar_ruta(char ruta[]);

void listar_dir(char ruta[], struct copia aux[], struct copia viejo[], int *cantidad);
void renombrar(char ruta[], struct copia aux[], struct copia viejo[],int *cantidad);
void guardar (char ruta[], struct copia aux[], struct copia viejo[], int *cantidad);
void mostrar(char ruta[]);


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

struct copia aux[MAXLONG], viejo[MAXLONG];
char ruta[MAXLONG];
int cantidad=0, repetir;

do{
repetir=0;
   system ("cls");
   printf("\n\n\t\t\t***** RENAMEADOR *****\n\n\n");
   printf("Arrastra la carpeta contenedora o escribe/pega la ruta\n\n");
   printf("DISCLAIMER: En caso de que los archivos no se hayan renombrado y el programa no muestre error\n\t    revisa las contrabarras '\\' en la direccion proporcionada...\n\n");
   printf("\n\nRuta de los archivos: "); gets(ruta);
if (validar_ruta(ruta)){
listar_dir(ruta,aux,viejo,&cantidad);
   renombrar(ruta,aux,viejo,&cantidad);
   guardar(ruta,aux,viejo,&cantidad);
   mostrar(ruta);
}
else repetir=1;
}while (repetir);
return 0;
};

int validar_ruta(char ruta[]){

int i;
char enter, aux;

carpeta = opendir(ruta);
if (carpeta == NULL){
printf("\nRuta a buscar: %s\n",ruta);
printf("\nEsta ruta no es valida !!\n");
printf("\n\n\nPress ENTER to retry..."); scanf("%c",&enter);
closedir(carpeta);
return 0;
}
else{
closedir(carpeta);
/*comprueba la ruta y añade un \ final si es necesario*/
while (ruta[i]!='\0'){
i++;
}
// printf("\n%c\n",ruta[i-1]); // ¿cual es el ultimo caracter?
if (ruta[i-1]!='\\'){ // si el ultimo caracter NO ES \, se lo añades.
strcat(ruta,"\\");
}
else return 1;
}
}

void listar_dir(char ruta[], struct copia aux[], struct copia viejo[], int *cantidad){
int i;
*cantidad=0;
    carpeta = opendir(ruta);

printf("\nRuta a buscar: %s\n",ruta);
    if (carpeta != NULL){ // verifica que la ruta sea valida
     printf("Archivos actuales:\n\n");
        while ((archivo = readdir(carpeta))){ // lee el directorio
        // puts (archivo->d_name);
         if (strcmp(archivo->d_name,".")){
         if (strcmp(archivo->d_name,"..")){
strcpy(aux[*cantidad].nombre,archivo->d_name); //copia al struct auxiliar la info que va recopilando el struct de dirent.h
        puts (aux[*cantidad].nombre);
        strcpy(viejo[*cantidad].nombre,aux[*cantidad].nombre); // copia el aux a uno viejo que en guardar sirve para el rename
*cantidad+=1; // auxiliar para saber cuántos archivos ha leido
    }
   }
}
}
    
    else
        perror ("\nError al abrir el directorio...  Existe?\n\n");
    closedir(carpeta);
}

void renombrar(char ruta[], struct copia aux[], struct copia viejo[], int *cantidad){
int i, j, l, ints;

printf("\n\nNumero de primeros caracteres a eliminar: "); scanf("%d",&ints);
system("cls");
for (i=0; i<*cantidad; i++){
l=strlen(aux[i].nombre); // utilizar el tamaño del nombre para cortar el siguiente for a la hora de renombrarlo.
for (j=0; aux[i].nombre[j]!='\0'; j++){
aux[i].nombre[j]=aux[i].nombre[j+ints]; // empieza substituyendo la posicion [0] de aux.nombre por lo que hay en la posición que ha marcado el user.
}
// puts (aux[i].nombre); // struct aux con todos los nombres ya modificados
}
}

void guardar (char ruta[], struct copia aux[], struct copia viejo[], int *cantidad){
char ruta_nuevo[MAXLONG], ruta_viejo[MAXLONG];
int i, opcion=0;
printf("\n\n");
    
    printf("Los archivos se renombraran de la siguiente manera:\n\n");
    for (i=0; i<*cantidad; i++){
     printf ("%s\n",aux[i].nombre);
}
printf("\n\nEstas segur@ de sobreescribir?\n");
printf("1) Yes\n");
printf("2) No\n");
printf("Opcion: "); scanf("%d",&opcion);

if (opcion==1){
for (i=0; i<*cantidad; i++){

strcpy (ruta_viejo,ruta);
strcat(ruta_viejo,viejo[i].nombre);
// printf("Archivo Viejo: %s\n",ruta_viejo);

strcpy (ruta_nuevo,ruta);
strcat (ruta_nuevo,aux[i].nombre);
// printf("Archivo Nuevo: %s\n\n",ruta_nuevo);

rename(ruta_viejo,ruta_nuevo);
   }
}
}

void mostrar(char ruta[]){
system ("cls");
carpeta = opendir(ruta);
printf("\nArchivos almacenados en: %s\n\n",ruta);
    while ((archivo = readdir(carpeta))){
if (strcmp(archivo->d_name,".")){
         if (strcmp(archivo->d_name,"..")){
         puts (archivo->d_name);
         }
        }
}
    closedir(carpeta);
}
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines