Langage C gestion fichiers et répertoires [Fermé]

Signaler
Messages postés
125
Date d'inscription
dimanche 10 août 2008
Statut
Membre
Dernière intervention
7 janvier 2013
-
nagashima
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
-
Bonjour,

La question se trouve au titre. Je programme du C sur linux, et je souhaite créer des arborescences dans lesquelles je veux stocker mes fichiers. Voici mon code :

typedef struct{

	char* depot_reponse;
	char* depot_colonnes_en_cours;
	
} noms_repertoires;

noms_repertoires mes_repertoires;
 
/** J'initialise mes noms de repertoires */

mes_repertoires.depot_reponse ="depot_calcul_reponse";	mes_repertoires.depot_colonnes_en_cours="depot_calcul_reponse/depot_colonnes_en_cours"; 

/* creation de l'arborescence */

mkdir( mes_repertoires.depot_reponse, "777" );
mkdir( mes_repertoires.depot_colonnes_en_cours, "777" );

/** Ici je veux créer un fichier dans depot_colonnes_en_cours qui lui même dans depot_reponse*/

char* mon_fichier= "fichier_colonne.xxx"

/* je concatene les deux chaines */

strcat(mes_repertoires.depot_colonnes_en_cours, mon_fichier);

/* creation du fichier */

FILE* myfile= fopen(mes_repertoires.depot_colonnes_en_cours, "wb");
 // UTILISATION
fclose(myfile);


Résultat: aucun fichier crée et "segmentation fault"
Merci pour vos aides.

12 réponses

Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
166
salut !
alors déja, il faut que tu initialise la taille de tes char * , sinon ca plantera ou buggera souvent.

ensuite pour ta méthode mkdir je suppose que tu l'as créer ou alors que tu as un .h qui les as .?
Messages postés
125
Date d'inscription
dimanche 10 août 2008
Statut
Membre
Dernière intervention
7 janvier 2013
4
Merci,

En fait, j'ai dejà un include<dirent.h> desolé de l'avoir oublié ici.
Les methodes mkdir créent bien mon arborescence, mais je sais pas comment mettre un fichier specficique dans une arborescence specifique.
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
166
ok je vois, je ne connais pas cette bibliothèques. mais avec system.h tu pourras faire :

char * emplacement = "c:\mondossier1\mondossier2\ ... ";

puis tu pourras faire :

char commande[500] = "copy MonFichier.jesaispas \0";
strcat(commande , emplacement);

system(commande);


en gros ca fera dans ta console :

copy MonFichier.jesaispas c:\mondossier1\mondossier2\

ce qui copiera ton fichier dans le chemin (ou dossier ou ce que tu veux)
et tu récupère le chemin grâce à l'arborescence et la recherche)
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 629
A nagashima
char * emplacement = "c:\mondossier1\mondossier2\ ... ";
Attention, il faut doubler l'antislash.

char commande[500] = "copy MonFichier.jesaispas \0";
Pas besoin de \0.
copy n'est pas une commande GNU/Linux reconnu. Il s'agit de cp.

system(commande);
Vraiment sale ^^. Autant programmer en shell dans ce cas ^^.

A youscoul
La fonction permettant de copier un fichier dans un répertoire n'existe pas en C de manière standard. Il faut donc te la créer. Tu te crées le fichier avec fopen, ensuite tu parcours le fichier source et tu le copies ligne par ligne dans ton fichier destination (fgets, fprintf).

Cordialement,
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
166
pour le '\0' c'est pour la fin de commande fin bon.

c'est vrai que c'est pas trés propre mais c'est au plus simple pour ce qui veut faire je pense ^^
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
166
erf oui j'avais zappé qu'il était sous linux donc je pensais pas a certaines choses x) (genre les commandes 'fin bon)

la gestion de fichier peu etre une solution plus propre en effet au niveau du code,mais au final ca fera juste la meme chose : une copie de fichier n'en est que la réecriture donc autant profiter des appels console qui fonctionnent bien. après vous faites comme vous voulez ;)
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 629
Nagashima,

Je réponds pour tes deux posts.

pour le '\0' c'est pour la fin de commande fin bon.
Oui, mais quand tu mets char toto[]="coucou"; tu as le \0 qui se greffe automatiquement en fin de chaîne.


la gestion de fichier peu etre une solution plus propre en effet au niveau du code,mais au final ca fera juste la meme chose : une copie de fichier n'en est que la réecriture donc autant profiter des appels console qui fonctionnent bien. après vous faites comme vous voulez ;)

Euh non mais alors pas du tout. D'une part, c'est moins performant en allouant la place nécessaire pour l'ouverture de la console, l'écriture et l'exécution. Et puis le fait que la console s'ouvre, ça ne le fait pas.

Autant, on peut utiliser les appels au kernel via des API à condition de bien le séparer du code standard pour faciliter la portabilité du code. Mais pour utiliser des appels consoles, non. La manière conseillée en C, c'est de se faire la fonction soi-même. En plus, écrire un programme en C en usant des appels consoles est non seulement plus compliqués, plus long, et moins performant que son homologue écrit en bash.

Eh oui, le C c'est pas si facile ;-))).
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
166
pour ce qui est de la console, elle peu toujours s'exécuter en silent il me semble mais après ça c'est juste un petit détail.
Après en effet tu utilisera l'ouverture de la console en plus par rapport à la recopie du fichier ce qui prendra un peu plus de mémoire, mais perso je trouve pas une grande différence ... mais j'avoue coder en ce moment sur un pc où la mémoire n'est pas un problème (en tout cas si ça se joue à quelques Ko) ce qui peu porter défaut dans ma réflexion (j'ai pas codé pour microCtr depuis deux ans et je reconnais avoir pris de mauvaises habitudes ><)
pour ce qui est du \0 c'est juste que j'ai pris l'habitude juste pour être sûr (j'ai déjà eu 2/3 problèmes donc c'est devenu une habitude.

J'ai l'impression de me justifier xD, en tout cas, la recopier de fichier via file* est une bonne idée, mais je ne voit pas comment on peut se positionner dans un emplacement du disque sans passer par la console, je suis donc tout ouïe pour la solution que vous trouverez pour ca \o/
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 629
Un autre inconvénient de la console, c'est que ce n'est absolument pas portable puisque chaque commande est propre à l'OS ^^.

Sinon, tu ne vois pas comment te positionner dans un emplacement du disque ?
Peux-tu être plus précis et donner un exemple ? Et je te donne la solution (enfin j'espère) ^^?
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
166
et bien en prenant son exemple.
sinon disons que l'on se trouve dans le fichier du projet (peu importe) et qu'on veuille aller sous /etc (sous linux) uniquement par le code sans appel console, je ne sais pas (de même sous windows par exemple, sauf que ca serai c:\windows).

par conter je sais faire des ifndef pour la portabilité mdr (en fin de compte, mon problème est le même que youscoul si on ne veut pas prendre la console =) )
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 629
Si tu souhaites ouvrir un fichier qui se trouve dans un autre répertoire, comme /etc, tu mets juste FILE*fp=fopen("/etc/toto","r");
Néanmoins, tu peux aussi changer de répertoire courant via l'utilisation de la fonction POSIX chdir().
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
166
ah ok, j'étais pas sur que mettre le chemin dans fopen fonctionnait (d'un autre côté j'avais pas testé ... ^^)

merci de l'info !