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.
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.
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).
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 ;)
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.
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/
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) ^^?
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 =) )
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().