Langage C gestion fichiers et répertoires

Fermé
youscoul Messages postés 125 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 7 janvier 2013 - 11 juin 2010 à 10:00
 Utilisateur anonyme - 11 juin 2010 à 15:35
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.
A voir également:

12 réponses

Utilisateur anonyme
11 juin 2010 à 10:33
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 .?
0
youscoul Messages postés 125 Date d'inscription dimanche 10 août 2008 Statut Membre Dernière intervention 7 janvier 2013 4
11 juin 2010 à 11:33
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.
0
Utilisateur anonyme
11 juin 2010 à 12:06
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)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 juin 2010 à 13:02
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,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
11 juin 2010 à 13:37
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 ^^
0
Utilisateur anonyme
11 juin 2010 à 13:48
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 ;)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 juin 2010 à 14:01
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 ;-))).
0
Utilisateur anonyme
11 juin 2010 à 14:30
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/
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 juin 2010 à 14:56
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) ^^?
0
Utilisateur anonyme
11 juin 2010 à 15:14
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 =) )
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
11 juin 2010 à 15:32
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().
0
Utilisateur anonyme
11 juin 2010 à 15:35
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 !
0