[PROG] Concaténation

Fermé
Utilisateur anonyme - 29 août 2007 à 10:37
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 - 30 août 2007 à 11:53
Bonjour

J'ai dans un dossier x fichiers .txt comprenant tous la même première ligne puis une seconde ligne de valeurs propre à chaque fichier.
J'aimerai concaténer automatiquement tous ses fichiers dans un seul... seulement j'aimerai que la première ligne de ses fichiers ne soient pas répétée à chaque fois mais qu'une seule fois.

Je peux soit le faire en DOS soit en langage C...
Es-ce possible ? Comment puis-je faire ?
A voir également:

20 réponses

Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
29 août 2007 à 10:44
Je pense que c'est plus simple en C qu'en shell DOS.
L'algorithme sera le suivant :
Ouvrir le fichier résultat
Pour chaque fichier contenu dans le dossier faire
Ouvrir le fichier
Lire la prmière ligne
Lire la deuxième ligne
Ecrire la ligne lue dans le fichier résultat
Fermer le fichier
Fin pour

Pour coder ça, tu pourras utiliser les fonctions C standard : fopen, fclose, fputs, fgets.
J'espère simplement pour toi que les fichiers ont une structure fixe ou peu variable ; ce sera plus simple à coder !
Bon courage ...
0
Utilisateur anonyme
29 août 2007 à 11:23
Ok! Comment je peux différencier, la ligne 1 de la ligne 2 ?
0
Utilisateur anonyme
29 août 2007 à 11:26
Ouvrir un répertoire, c'est pareil qu'ouvrir un fichier ? Je compte les fichier comment ?
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
29 août 2007 à 11:30
Le plus simple serait de connaître exéctement le nombre de caractères de la ligne 1.
Quand tu fais fopen, tu es placé au début du fichier. Quand tu fais fgets, tu indiques le nombre de caractères à lire. Il faut donc savoir combien de caractères composent ta ligne.
Si cette taille est variable, tu devras faire une bidouille pour lire les caractères un à un et détecter le caractère de fin de ligne.
Une fois le saut de ligne détecté, tu n'auras plus qu'à récupérer tout ce qui est après.

As-tu une description des fonctions C relatives aux fichiers ? Sinon tout est là :
http://cermics.enpc.fr/~ts/C/FUNCTIONS/function.ref.html
0

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

Posez votre question
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
29 août 2007 à 11:37
Je pense que cette page pourrait t'aider :
https://c.developpez.com/faq/?page=Les-fichiers-et-les-dossiers
0
Utilisateur anonyme
29 août 2007 à 15:52
J'y arrive avec un seul fichier mais pas avec un dossier comportant x fichiers.

Merci de m'aider
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
29 août 2007 à 16:01
J'ai trouvé ce bout de code ; il peut t'inspirer !

> #include <stdio.h>
> #include <dirent.h>
> #include <sys/types.h>
> #include <stdlib.h>

#include <strings.h>

> int nivo;
> void execute(char *fichier)
> {
> printf("voila ton fichier :%s ki se situe au nivo:%d\n",fichier,nivo);
> }
>
> void afficheContenu(char * repertoire)
> {
>
> DIR *dir;
> struct dirent *courant;
> char *filePath;
> dir=opendir(repertoire);
> if(dir==NULL)
> return;
>
> printf("***************************************************\n");
> printf("je rentre dans le repertoire:%s\n",repertoire);
> while((courant=readdir(dir)) != NULL )
> {
> filePath=(char *)malloc(strlen(repertoire)+strlen(courant->d_name)+1);
> sprintf(filePath,"%s%c%s",repertoire,'/',courant->d_name);
> if(courant->d_type==4 && ( (strcmp(courant->d_name,".")) && (strcmp(courant->d_name,".."))))
0
Utilisateur anonyme
29 août 2007 à 16:07
Je n'ai pas la librairie dirent.h, j'utilise Visual C++.
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
29 août 2007 à 16:09
Allons y à la sauce Windows alors !

#include <windows.h>

WIN32_FIND_DATA File;
HANDLE hSearch;
BOOL re;

hSearch=FindFirstFile("*.*", &File);
if(hSearch == INVALID_HANDLE_VALUE)
{
return FALSE;
}

re=TRUE;
do
{
/* Traitement */
re = FindNextFile(hSearch, &File);
} while(re);

FindClose(hSearch);
return TRUE;
0
Utilisateur anonyme
29 août 2007 à 16:16
Le programme me paraît bon, pourtant Visual C++ ne parvient pas à le compiler, il me met:

fatal error C1083: Cannot open include file: 'windows.h': No such file or directory...


Curieux que Visual C++ ne trouve pas cette librairie...
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
29 août 2007 à 16:18
C'est peut-être "sys/windows.h" ou une histoire comme ça...
Recherche dans le répertoire où sont tes autres headers.
0
Utilisateur anonyme
29 août 2007 à 16:25
Toutes les libairies appelés par windows.h manquent également, je comprend pas...
J'essai de les implanté dans le dossier include manuellement.
0
Utilisateur anonyme
30 août 2007 à 10:36
Je crée une tableau à une seule dimension de 6 caractères donc je fais:

char ligne2[6];


J'entre à l'intérieur 6 caractères venant d'un fichier texte avec les commandes fgets et fputs...
J'obtiens un tableau à une dimension de 17 caractères...

Sachant que les 6 premières valeurs sont corrects et à la fin il met des I avec accent grave suivi d'un petit carré....
Pourquoi mon tableau s'allonge ?
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
30 août 2007 à 10:39
Bienvenue dans les grandes joies du C !!
Si tu ne mets pas de caractère '\0' à la fin de ta chaîne de caractères, lorsque tu la lis, toutes les données du segment mémoire sont lues jusqu'au prochain '\0'.
Si tu veux pouvoir mettre 6 caractères dans ta chaîne, tu dois la définir sur 7 et renseigner ligne2[6] avec '\0'.
0
Utilisateur anonyme
30 août 2007 à 10:40
Ah oui c'est vrai, je l'avais oublié celui-la

Merci
0
Utilisateur anonyme
30 août 2007 à 11:07
Merci pour tout ce que tu as déjà fait. Désolé de te déranger mais j'ai une autre question:

J'ai utilisé la commande Dos suivante pour générer un fichier texte:

echo "Numéro de série _ Mesure _ Cible">texte.txt


Les underscore représente une tabulation (mais là n'est pas le problème)...
Je dois faire un saut de ligne après Cible... Comment puis-je m'y prendre?
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
30 août 2007 à 11:09
Pour un saut de ligne Windows, tu dois ajouter \r\n :
echo "Numéro de série _ Mesure _ Cible\r\n">texte.txt
Pour un saut de ligne UNIX, \n uniquement.
0
Utilisateur anonyme
30 août 2007 à 11:12
Il m'affiche "\r\n" dans le fichier texte qu'il crée.
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
30 août 2007 à 11:15
Alors essaie ca :
echo "Numéro de série _ Mesure _ Cible">texte.txt
echo "">texte.txt
0
Utilisateur anonyme
30 août 2007 à 11:16
Il écrase ce que j'ai déjà mis par ""
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
30 août 2007 à 11:17
Ah pardon :
echo "Numéro de série _ Mesure _ Cible">texte.txt
echo "">>texte.txt
0
Utilisateur anonyme
30 août 2007 à 11:20
ça fonctionne, le seul problème, c'est qu'il me met des guillemet, cela pourrait posait des problème par la suite...
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
30 août 2007 à 11:22
Si tu fais :
echo "Numéro de série _ Mesure _ Cible">texte.txt
echo >>texte.txt
0
Utilisateur anonyme
30 août 2007 à 11:23
Il m'affiche maintenant "Commande ECHO activé"
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
30 août 2007 à 11:29
echo. >>texte.txt ?????
0
Utilisateur anonyme
30 août 2007 à 11:51
En fait, un echo fait automatiquement un retour chariot à la fin, le problème est que dès fois j'ai besoin du retour chariot et dès fois non.
Sous Unix, je sais qu'il est possible d'empêcher le fameux retour chariot mais je ne sais pas si c'est possible sous DOS
0
Chacual Messages postés 230 Date d'inscription jeudi 28 juin 2007 Statut Membre Dernière intervention 15 octobre 2007 149
30 août 2007 à 11:53
Je suis bien meilleur sous UNIX que sous DOS. Je ne pourrai donc pas t'aider plus là-dessus...
0