ampholyte a écrit:Je pense aussi que tu te poses beaucoup de question. En programmation, la seule façon de bien comprendre c'est de tester, tester, tester, ...., est-ce que j'ai déjà dit testé ? ^^
Rockleader a écrit:Enfin bref de toute façon je n'en suis pas encore là
Je trouve ce projet que l'on nous as confié plutôt intéressant; car il doit se rapprocher de ce que l'on pourrait nous demander un jour de faire je pense. Le sujet est assez farfelu et il faut le décrypter. Il n'y a donc pas qu'une partie de simple codage à faire.
Je vais en baver mais je devrais en ressortir fortifié dans la maîtrise du langage je pense.
r5_defines.c:13:35: error: expected ) before string constant
*g_disk.storage[k]=fopen(adresse"/d%d,k","r");
^
r5_defines.c:13:35: error: too few arguments to function fopen
In file included from r5_defines.c:1:0:
/usr/include/stdio.h:272:14: note: declared here
extern FILE *fopen (const char *__restrict __filename,
typedef struct virtual_disk_s {
inode_table_t inodes;
int ndisk;
int raidmode;
FILE *storage[NUMBER_OF_DISKS];
} virtual_disk_t;void init_disk_raid5(char* adresse)
{
g_disk.ndisk=NUMBER_OF_DISKS;
g_disk.raidmode=5;
int k;
for (k=0;k<NUMBER_OF_DISKS;k++)
{
*g_disk.storage[k]=fopen(adresse"/d%d,k","r"); /*en fait je voudrais 'essayer' de concaténer
les noms de fichiers à l'adresse qui ne contient qu'un nom de dossier; à moins qu'il n'y ait
une fonction pour ouvrir un dossier seulement*/
}
}Rockleader a écrit:Je suis désolé j'ai encore une question è_é
Est il possible avec fopen ou une autre fonction d'ouvrir uniquement un dossier ?
D'autre part; j'essaie de faire quelque chose mais le compilo n'aime pas; et j'aurais voulu savoir s'il y avait un moyen pour le faire.
Voici l'erreur que je prend:
- Code: Tout sélectionner
r5_defines.c:13:35: error: expected ) before string constant
*g_disk.storage[k]=fopen(adresse"/d%d,k","r");
^
r5_defines.c:13:35: error: too few arguments to function fopen
In file included from r5_defines.c:1:0:
/usr/include/stdio.h:272:14: note: declared here
extern FILE *fopen (const char *__restrict __filename,
FILE * fopen(const char * restrict path, const char * restrict mode);
file = fopen("dossier/sous-dossier/mon_fichier", "r");
typedef struct virtual_disk_s {
inode_table_t inodes;
int ndisk;
int raidmode;
FILE *storage[NUMBER_OF_DISKS];
} virtual_disk_t;int main()
{
DIR* rep = NULL;
FILE *file = NULL;
struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
rep = opendir("D:\\Mes Documents\\JaKy");
if (rep == NULL)
exit(1);
/* On ouvre le fichier à lire */
while ((fichierLu = readdir(rep)) != NULL) {
/* On ouvre chaque fichier : fopen(fichierLu->d_name, "r"); */
/* On fait le traitement */
}
if (closedir(rep) == -1)
exit(-1);
return 0;
}
ampholyte a écrit:Et bien une fois ton dossier ouvert, tu as besoin de le parcourir pour récupérer le nom des tes fichiers contenus dans ce dossier.
La première page te donne toutes les solutions pour réussir à gérer ton fichier.
- Code: Tout sélectionner
int main()
{
DIR* rep = NULL;
FILE *file = NULL;
struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
rep = opendir("D:\\Mes Documents\\JaKy");
if (rep == NULL)
exit(1);
/* On ouvre le fichier à lire */
while ((fichierLu = readdir(rep)) != NULL) {
/* On ouvre chaque fichier : fopen(fichierLu->d_name, "r"); */
/* On fait le traitement */
}
if (closedir(rep) == -1)
exit(-1);
return 0;
}
/* Imaginons que d_name = "image.bmp" */
img = SDL_LoadBMP(fichierLu->d_name);void init_disk_raid5(char* adresse)
{
g_disk.ndisk=NUMBER_OF_DISKS;
g_disk.raidmode=5;
DIR* rep = NULL;
struct dirent* fichierLu = NULL; /* Déclaration d'un pointeur vers la structure dirent. */
rep = opendir(adresse);
if (rep == NULL)
exit(1);
while ((fichierLu = readdir(rep)) != NULL)
{
int k;
for (k=0;k<NUMBER_OF_DISKS;k++)
{
g_disk.storage[k]=fopen("d%d,k","r");
}
}
}int k = 0
while ((fichierLu = readdir(rep)) != NULL) {
/* On vérifie qu'il ne s'agit pas de . et .. */
if (strcmp(fichierLu->d_name, ".") == 0 || strcmp(fichierLu->d_name, "..") == 0) {
continue;
}
g_disk.storage[k]=fopen(fichierLu->d_name,"r");
k ++;
}
Que se passe-t'il si tu as plus de fichier que de place dans ton tableau ?
Rockleader a écrit:Ben en fait sachant que j'ai 4 fichier nommé d0 d1 d2 d3 je voulais trouvé un moyen de ne pas me mettre une ligne pour ouvrir chaque fichier.
Ce cas là est impossible vu que k s'incrémente jusqu'à la constante du nombre de fichier.
Et cette constante est elle même à l'origine de la création des fichiers dans un script fourni.
char buffer[255 + 1] = {0};
int i = 0;
for (i = 0; i < 10; i++) {
sprintf(buffer, "mon_fichier_%d", i);
fprintf(stdout, "%s\n", buffer);
}
Les technologies RAID (pour Redundant Array of Independent Disks) permettent de repartir les
donnees sur plusieurs disques durs afin dam
eliorer la tol
erance aux pannes, la s
ecurit
e des donn
ees,
ou les performances dacc`es. Ces technologies sont aussi capable de combiner ces differents crit`eres
pour offrir un espace de stockage s
ur, resistant aux pannes et rapide dacc`es. Les technologies RAID sont identifi
ee par un num
ero indiquant les crit`eres support
es. Nous nous int
eressons ici `a la technologie RAID 5, qui permet `
a la fois un fonctionnement resistant aux pannes et une grande perfor-
mance lors de la lecture de fichiers. Une introduction synthetique `a ces technologies est disponible `a lurl
http://fr.wikipedia.org/wiki/RAID_(informatique).
Lobjectif de ce projet est de developper en langage C une version simplifi
ee de la technologie RAID 5.
#ifndef __R5_DEFINES__
#define __R5_DEFINES__
#define NUMBER_OF_DISKS 4
#define BLOCK_SIZE 4
#define FILENAME_MAX_SIZE 32
#define MAX_FILES 100
#define MAX_FILE_SIZE (50*1024)
#include
typedef unsigned int uint;
typedef unsigned char uchar;
/* Type of a block of data */
typedef struct block_s{
uchar data[BLOCK_SIZE];
} block_t;
/* Type of the pseudo-inode structure */
typedef struct inode_s{
char filename[FILENAME_MAX_SIZE];
uint size;
uint nblock; // nblock = (size+BLOCK_SIZE-1)/BLOCK_SIZE
uint block_id;
} inode_t;
/* Type of the inode table */
typedef inode_t inode_table_t[MAX_FILES];
/* Type of the virtual disk system */
typedef struct virtual_disk_s {
inode_table_t inodes;
int ndisk;
int raidmode;
FILE *storage[NUMBER_OF_DISKS];
} virtual_disk_t;void init_disk_raid5(char* adresse)
{
g_disk.ndisk=NUMBER_OF_DISKS;
g_disk.raidmode=5;
rep = opendir(adresse);
if (rep == NULL)
exit(1);
while ((fichierLu = readdir(rep)) != NULL)
{ /*a remplacer par la boucle en sprintf si cela marche*/
g_disk.storage[0]=fopen("d0","r");
g_disk.storage[1]=fopen("d1","r");
g_disk.storage[2]=fopen("d2","r");
g_disk.storage[3]=fopen("d3","r");
}
}
void close_disk_raid5(char* adresse)
{
while ((fichierLu = readdir(rep)) != NULL)
{
fclose(g_disk.storage[0]);
fclose(g_disk.storage[1]);
fclose(g_disk.storage[2]);
fclose(g_disk.storage[3]);
}
closedir(rep);
}On consid`ere que notre syst`eme R AID 5 est represent
e par la variable globale virtual disk t g disk ;.
Avant de pouvoir lutiliser, il est necessaire de linitialiser `a partir du nom du r
epertoire contenant
les disques virtuels formates. Ecrire
la fonction init disk raid5 qui, `a partir du nom du repertoire,
initialise cette variable globale. Dans un premier temps, on ninitialisera pas la table dinodes.
Lorsque notre syst`eme sera eteint, il sera n
ecessaire de sassurer de labsence de risque de perte
de donnees. Pour cela,
ecrire une fonction qui
eteint notre syst`eme R AID 5.
Rockleader a écrit:Sa va être un peu chaud d'expliquer tout ce que je dois faire et pourquoi je le fais sans mettre la totalité de mon sujet du projetsurtout qu'il est tout à fait possible que je comprenne de travers certaines choses...
Je le mettrais peut être.
En ce qui concerne sprintf j'y avais pensé; mais à priori ça ne "concatène" que des chaines du coup je pense pas que ta solution fonctionne, mais je vais tout de même tenter.
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 5 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :