Bonjour,
Je dois faire un programme en C, le but est d'utiliser les primitives systèmes pour rechercher une chaîne dans chaque fichier en utilisant une lecture efficace (pas une lecture octet par octet). Il faut afficher le nom de chaque fichier trouvé.
Pour le moment j'ai réalisé ces deux fonctions mais j'ai vraiment l'impression que ma méthode n'est pas assez efficace et trop basique :
#define BUFFER 128
typedef struct FICHIER {
unsigned char buff[BUFFER_SIZE]; // buffer
unsigned char* posBuffer; // position dans le buffer
unsigned char * endBuffer; // pointeur sur la fin du buffer
int fd; // descripteur de fichier
} FICHIER;
int my_getc(FICHIER *file) {
int c;
if (file == NULL) return EOF;
if (file->mode != 'r') return EOF;
if (file->posBuffer == file->endBuffer) {
file->posBuffer = file->b;
c = read(file->fileDescriptor, file->b, BUFFER);
file->endBuffer = file->b + c;
if (c == -1 || c == 0) return EOF;
}
return *file->posBuffer++;
}
void parcoursRepertoire(char* chemin, char* recherche) {
struct dirent *d;
FICHIER *file;
char r;
unsigned int nb;
unsigned int rechercheLongueur = strlen(recherche);
DIR *dp = opendir(chemin);
if (dp == NULL) {
return EXIT_FAILURE;
}
while ((d = readdir(dp)) != NULL) {
if (d->d_name[0] != '.') {
if (d->d_type == DT_DIR) {
parcoursRepertoire(strcat(d->d_name, "/"), recherche);
}
else if(d->d_type == DT_REG){
nb = 0;
file = fopen(strcat(d->d_name, "/"), "r");
while ((r = my_getc(file)) != EOF) {
if (r == recherche[nb]) {
nb++;
if (nb == rechercheLongueur) {
printf("%s\n", d->d_name);
}
}
else {
nb = 0;
}
}
fclose(file);
}
}
closedir(dp);
}
}