Underc0de - La Casa de los Informáticos

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: Frijolito en Noviembre 24, 2018, 09:02:58 PM

Título: Problema al acceder a un directorio en C
Publicado por: Frijolito en Noviembre 24, 2018, 09:02:58 PM
Hola, tengo un pequeno problema que llevo mucho todo el dia tratando de solucionar.  Lo que pasa es que intento acceder a un directorio y me manda un error violación de segmento voy a dejar una foto:
(https://i.ibb.co/99CFW2K/Captura-de-pantalla-de-2018-11-24-20-52-12.png) (https://ibb.co/gMB5Jwq)
Tambien ejecute el programa como "sudo ./xor" y tampoco funciona probablemente  sea un error pequeno pero de verdad no logro encontrar el porque.

Gracias de antemano.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>

void Direc();
void FileSize(char *fileN);
void Cifrar(char *fileN);

int main(){

Direc();
return 0;
}

void Cifrar(char *fileN){

char c;
int clave;

clave = rand()% 255 + 0;

FILE *file;
file = fopen(fileN, "rb+");

int i = 0;
while((c = fgetc(file)) != EOF){
fseek(file, i, SEEK_SET);
i++;
fputc((c ^ clave), file);
}
i = 0;
fclose(file);
printf("   Crifrado. \n");
}

void Direc(){

char *ndir;
char *p=getenv("USER");

printf(" [>>] Introduca el directorio: \n");
printf("  %s~$: ",p);
scanf("%s", ndir);
printf("%s\n",ndir);

DIR *dir;
struct dirent *ent;
dir = opendir(ndir);

if(dir == NULL){
printf("  [>>] Error al buscar el directorio \n");
}

while((ent = readdir(dir)) != NULL){
if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
}
FileSize(ent->d_name);
}
}

void FileSize(char *fileN){

long ftam = -1;
FILE *file;
file = fopen("fileN", "r");

if(file){
fseek(file, 0L, SEEK_END);
ftam = ftell(file);
fclose(file);
printf("%30s (%ld bytes)",fileN, ftam);
}
Cifrar(fileN);
}
Título: Re:Problema al acceder a un directorio en C
Publicado por: Solid Water en Noviembre 24, 2018, 09:46:06 PM
Frijolito hasta el lunes no estoy en casa y no puedo probar nada, pero quería decirte algo.
En esta parte del código:

  while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
                }
                FileSize(ent->d_name);
        }


Tu quieres decir que si es el . o el .. el archivo no haga nada pero sin embargo de todas modos llamas al FileSize, por que debería ser así:

   while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
                 
                      FileSize(ent->d_name);
                }
               
        }


Saludos recién el lunes a la tarde/noche podría probarlo.
Igual no sé si es eso lo que querías hacer.

Título: Re:Problema al acceder a un directorio en C
Publicado por: Frijolito en Noviembre 24, 2018, 10:21:28 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Frijolito hasta el lunes no estoy en casa y no puedo probar nada, pero quería decirte algo.
En esta parte del código:

  while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
                }
                FileSize(ent->d_name);
        }


Tu quieres decir que si es el . o el .. el archivo no haga nada pero sin embargo de todas modos llamas al FileSize, por que debería ser así:

   while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){
                 
                      FileSize(ent->d_name);
                }
               
        }


Saludos recién el lunes a la tarde/noche podría probarlo.
Igual no sé si es eso lo que querías hacer.

Gracias no me di cuenta de ese error pero aun así no deja acceder a ningún directorio directorio y no se porque es
Título: Re:Problema al acceder a un directorio en C
Publicado por: Solid Water en Noviembre 25, 2018, 11:31:30 PM
Frijolito le arreglé varias cosas, ya no crashea y funciona el cifrado, lo que no está devolviendo, es el filesize.
Pero el código corre y cifra.
Lo del FileSize te toca a vos.


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>

void Direc();
void FileSize(char  fileN[200]);
void Cifrar(char fileN[200]);

int main(){

        Direc();
        return 0;
}

void Cifrar(char fileN[200]){


        char c;
        int clave;

        clave = rand()% 255 + 0;


        FILE *file;
        file = fopen(fileN, "rb+");

        int i = 0;
        while((c = fgetc(file)) != EOF){
                fseek(file, i, SEEK_SET);
                i++;
                fputc((c ^ clave), file);
        }
        i = 0;
        fclose(file);
        printf("   Crifrado. \n");

}

void Direc(){

        char ndir[200];
        char *p=getenv("USER");

        printf(" [>>] Introduca el directorio: \n");
        printf("  %s~$: ",p);
        scanf("%s", ndir);

        printf("%s\n",ndir);

        DIR *dir;
        struct dirent *ent;
        dir = opendir(ndir);

        if(dir == NULL){
                printf("  [>>] Error al buscar el directorio \n");
        }

        while((ent = readdir(dir)) != NULL){
                if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") !=0) ){

                        printf("%s", ent->d_name);
                        strcat(ndir,ent->d_name);       
                        FileSize(ndir);
               }

        }
}

void FileSize(char fileN[200]){

        long ftam = -1;
        FILE *file;
        file = fopen("fileN", "r");

        if(file){
                fseek(file, 0L, SEEK_END);
                ftam = ftell(file);
                fclose(file);
                printf("%30s (%ld bytes)",fileN, ftam);
        }else{
                printf("no file \n");
        }
        Cifrar(fileN);
}


Después si querés hablamos por MP.

Saludos,