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);
}
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.
No tienes permitido ver los links.
Registrarse o Entrar a mi cuenta
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
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,