Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Tauron

#1
Cita de: string Manolo en  9 Septiembre 2019, 16:26 PM
Hola, ese comportamiento es normal. Los ides te mantienen la consola abierta tras finalizar la ejecución del programa para que puedas ver el resultado.

Para que la pausa se mantenga también en el ejecutable usa:
cin.get();
Ponlo antes del return 0; viene incluida en <iostream>. También tienes system("pause"); Lo verás mucho pero no es recomendado.

A parte también recomendarte que uses code::blocks en vez de DevCpp, es bastante más completo y se actualiza más frecuentemente.
Para escribir código yo uso notepadcpp y después con atajos de teclado copio, pego, compilo y ejecuto.

Entiendo. Muchas gracias por tu respuesta!!   :D
#2
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)
#3
VALE! Tras mucho buscar ya he encontrado el problema. No se trata de los espacios, sino de los acentos.
Por alguna razón el programa se pasa la tabla ASCII por donde le place y cada vez que encuentra algún caracter con acento, lo interpreta como otro totalmente distinto. (por ejemplo la vocal "ú" la interpreta como si fuese "·")

Como solución he hecho printf de cada vocal con sus acentos para ver cómo lo interpreta la consola.
De esta manera identificar los acentos y modificar en el input la vocal por el carácter que entienda la consola, así en el output saldrá la vocal con el acento de manera correcta y la ruta acaba funcionando.

EN FIN, una movida por no tener en cuenta que estaba en windows. Estoy acostumbrado a utilizar linux y no tenia problemas con caracteres especiales.
#4
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++

#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);
}