Langage C gestion fichiers et répertoires
youscoul
Messages postés
125
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
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 :
Résultat: aucun fichier crée et "segmentation fault"
Merci pour vos aides.
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:
- Gestion de fichier en c
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
12 réponses
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 .?
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 .?
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.
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.
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)
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)
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,
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,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ^^
c'est vrai que c'est pas trés propre mais c'est au plus simple pour ce qui veut faire je pense ^^
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 ;)
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 ;)
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 ;-))).
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 ;-))).
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/
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/
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) ^^?
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) ^^?
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 =) )
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 =) )