Problema al acceder a un directorio en C

Iniciado por Frijolito, Noviembre 24, 2018, 09:02:58 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 24, 2018, 09:02:58 PM Ultima modificación: Noviembre 27, 2018, 08:11:03 PM por xyz
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:
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
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.
Código: c
#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);
}

Noviembre 24, 2018, 09:46:06 PM #1 Ultima modificación: Noviembre 24, 2018, 09:48:43 PM por solid water
Frijolito hasta el lunes no estoy en casa y no puedo probar nada, pero quería decirte algo.
En esta parte del código:

 
Código: c
 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í:

   
Código: c
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.


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:

 
Código: c
 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í:

   
Código: c
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

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.

Código: c

#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,