[Débutant] Retourner une chaîne de caractères

Retourner une chaîne de caractères [Débutant] - C - Programmation

Marsh Posté le 11-03-2008 à 21:26:52    

Bonsoir, premier post, premières questions !
 
Pour le topo: je suis en 2eme année de Biologie et j'ai une UE d'info, mais le truc c'est qu'en bon biologiste, je suis pas doué en informatique, et le prof étant doctorant, il est pas rompu a l'enseignement, aussi, son cours est pour le moins bordélique et on sait pas trop ou chercher dans le petit poly.
 
Après mes péripéties sur le net, j'ai trouvé une base pour ce que je voulais faire.
 
Le pitch de la fonction à réaliser: Dans une séquence ADN donnée sous forme de fichier texte, il faut ouvrir le fichier texte en question, récupérer la séquence, la stocker dans un tableau, et la retourner dans un autre fichier texte.
 
Là, je pèche vraiment, a la fin de cette UE, je confonds tout et donc ça bug.
 
Voici la base de code que j'ai:

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main (void)
  4. {
  5.  
  6.   int indice, taille, moitie;
  7.   char seq[255];
  8.   char inter; // Stockage temporaire
  9.   // Lecture de la chaine
  10.   FILE *fichin;
  11.   FILE *fichout;
  12.   fichin = fopen("sequence.txt", "r" );
  13.   fichout = fopen ("sequence_ret.txt", "w" );
  14.                   while (!feof(fichin)) {
  15.                   fscanf (seq, 50, fichin);
  16.   // Inversion  
  17.  
  18.                   taille = strlen(seq);
  19.                   moitie = taille / 2;
  20.                   indice = 0;
  21.                          while(indice < moitie){   
  22.                          inter = seq[indice];
  23.                          seq[indice] = seq[taille-indice-1];
  24.                          seq[taille-indice-1] = inter;
  25.                          indice++;
  26.                                                }
  27.  
  28.   // Afficher le resultat ( Douteux :-P )
  29.   fputs(fichout, seq);
  30.   fclose(fichin);
  31.   fclose(fichout);
  32.   return 0;
  33.                                         }
  34. }


 
Si vous pouviez corriger mes erreurs (et m'explique pourquoi ces changements, je vous en serait très reconnaissant. En comptant sur vous, je vais essayer de l'améliorer par moi même, mais je n'en reste pas moins un néophyte.
 
Merci a ceux qui passeront du temps a se pencher sur le problème.
 
Eldran

Reply

Marsh Posté le 11-03-2008 à 21:26:52   

Reply

Marsh Posté le 11-03-2008 à 22:16:54    

wawawa en effet ... pas mal de melange ... Quelques pistes :
 
* feof ne fait pas ce que tu penses. Mais alors pas du tout. Recherche sur le forum, y a eu 50 exemple de comment lire un ficheir txt proprement.
* ca manque d'allocation dynamique pr gérer ces chaines proprement.

Reply

Marsh Posté le 12-03-2008 à 12:23:19    

A vrai dire j'ai que ca sur le poly pour faire ça, alors comme j'ai jamais eu d'info avant, je sais pas comment faire autrement.
 
Et d'autre part, je ne sais pas ce qu'est une allocation dynamique.
 
Donc je vais faire d'autres recherches :sarcastic:

Reply

Marsh Posté le 12-03-2008 à 13:28:37    

Pour avoir des informations sur une fonction sur unixoïde : man fonction
Et si t'es pas sur un unix, sous google ça marche aussi. [:dawa]

 

Or donc, pour ton fscanf() : il te faut lire la documentation pour savoir l'utiliser (man fscanf, donc). Parce que là, tel quel, je ne sais pas comment il agit, mais le format que tu lui donnes ("50" ), il ne doit pas aimer.
Il faut savoir que fscanf() est une fonction de lecture formatée, or ici tu n'as pas besoin de lire des données de manière formatée. Préfère donc plutôt fgets(), plus simple à gérer dans ton cas : fgets(variable de destination, taille de la variable de destination, flux à lire)

 

Et pour feof, man feof retourne ceci (entre autre) :

Citation :

    The function feof() tests the end-of-file indicator for the stream
     pointed to by stream, returning non-zero if it is set.  The end-of-file
     indicator can only be cleared by the function clearerr().

 

Donc, feof() retourne 1 si la fin du fichier a été atteinte, 0 sinon.
Seulement, voila, ça ne permet pas de déterminer la fin d'une lecture de fichier. Si par exemple il y a une erreur lors de celle-ci, feof() retournera toujours 0, par contre ferror() retournera 1.

 

Généralement, on boucle sur la fonction de lecture, jusqu'à ce que celle-ci retourne qu'il n'y a plus rien à lire :
while ( fgets(seq, 255, fichin) != NULL ) { ...

 

Ensuite seulement, une fois sorti de la boucle, tu pourras si tu en as envie vérifier pour quelle raison la lecture s'est arrêtée : feof(), ou ferror() ?

 


Bon, ensuite ton while(indice < moitie) : il est plus simple d'écrire cela sous forme d'une boucle for :
for(indice = 0; incice < taille; indice++)
{
...
}


Message édité par Elmoricq le 12-03-2008 à 13:34:24
Reply

Marsh Posté le 12-03-2008 à 13:31:19    

Bon, j'ai refait des recherches et j'ai trouvé un programme qui fait ce que je voudrais faire mais partiellement:
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(void)
  4. {
  5.   int indice, taille, moitie;
  6.   char mot[255];
  7.   char inter; // pour stocker un caractere temporairement
  8.   // Lecture de la chaine
  9.   printf("entrez un mot : " );
  10.   scanf("%s", mot);
  11.   // inversion jusqu'au milieu, sinon on obtient le meme tableau
  12.   // permutation 1ere case - derniere case
  13.   // permutation 2eme case - avant-der. case ...
  14.   taille = strlen(mot);
  15.   moitie = taille / 2;
  16.   indice = 0;
  17.   while(indice < moitie){   
  18.     inter = mot[indice];
  19.     mot[indice] = mot[taille-indice-1];
  20.     mot[taille-indice-1] = inter;
  21.     indice++;
  22.   }
  23.  
  24.   // afficher le resultat
  25.   printf("le mot inverse : %s\n", mot);
  26.   return 0;
  27. }


 
A partir de cette base, je voudrais mettre non plus une entrée manuelle, mais depuis un fichier texte, et non plus afficher le résultat a l'écran, mais sur un fichier de sortie, et moi je bloque, donc je vais me replonger dans les précédents exos faits en cours, mais je suis pas sur d'y trouver mon bonheur.

Reply

Marsh Posté le 12-03-2008 à 13:37:57    

Arrête de pomper du code à droite et à gauche, ça ne te sert à rien d'autre qu'à te perdre un peu plus à chaque fois.
 
Outre les manpages, tu peux consulter ce site sinon, une petite mine d'informations : http://mapage.noos.fr/emdel

Reply

Marsh Posté le 12-03-2008 à 14:34:50    

Le truc c'est que le poly qu'on a mets les instructions telles quelles sans trop d'indication de "pour quel cas" l'utiliser, donc on patauge un peu. Avec le prof on survole tout sans rien comprendre et la on a 4 séances de TP pour pondre un programme donc avec les bases que j'ai et les indications qu'on me donne (qui sont pour mon niveau claires comme de la vase), je suis obligé de m'inspirer ce codes et d'en changer le contenu pour approcher de ce que je veux.
 
Enfin bref, merci Elmoricq pour tes réponses, c'est toujours ça de pris pour avancer.

Reply

Marsh Posté le 12-03-2008 à 15:17:21    

Et si tu demandais plutôt que ce que tu ne comprends pas dans les explications que l'on te donne ? [:pingouino dei]
 
Tu es allé voir le lien que je t'ai donné ?

Reply

Marsh Posté le 17-03-2008 à 11:40:45    

essaye deja de lire un fichier, avec fopen/fgets et utilise printf pour l'afficher à l'éran.
Ensuite ajoute le code pour sauvegarder ce fichier
Et finalement tu enleve la sauvegarde et ajoute le code qui inverse ton fichier (affiche a l'écran avec printf)
Et refinalement tu resauvegarde le tout et tu aura fini.

Reply

Marsh Posté le 19-03-2008 à 17:01:07    

J'ai été sur les liens, et le prof nous a vaguement aidés en TD, et là j'ai un nouveau probleme, j'ai ce code ci (autre fonction):
 
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. void codlec (void);
  4. int main(void)
  5. {
  6.    codlec();
  7. }
  8. void codlec()
  9. {
  10. int i,j;
  11. char antibrin[9192]; 
  12. char codon[9192];
  13.     FILE * fp;                           
  14.     fp = fopen("sequence.txt","r" );           
  15.     FILE * fic;
  16.     fic = fopen("phaselecture.txt","w" );
  17. while (!feof(fp))
  18. {
  19.       fscanf(fp, "%c", &antibrin[9192]);
  20. }
  21. for (i=0; i<=9193; i+=3) {
  22. if (antibrin[i]=='T' && antibrin[i+1]=='A' && antibrin[i+2]=='G'){
  23.                        fprintf(fic,"TAG", codon);
  24.                        }
  25. else if (antibrin[i]=='T' && antibrin[i+1]=='A' && antibrin[i+2]=='A'){
  26.                        fprintf(fic,"TAA", codon);
  27.                        }
  28.                      
  29. else if(antibrin[i]=='T' && antibrin[i+1]=='G' && antibrin[i+2]=='A'){
  30.                        fprintf(fic,"TGA", codon);
  31.                        }
  32. else {
  33.      fprintf(fic,"-", codon);
  34.      }
  35. fclose(fp);
  36. fclose(fic);
  37.                        }
  38. }


Pour une lecture par codons (3 lettres par 3 lettres) et ça a fonctionné et sans nous souvenir de ce que nous avons modifié, ça ne marche plus ! Ca va faire 2h que je cherche d'ou vient l'erreur en vain, puisque le probleme est le suivant:
 
Dans le fichier de sortie, il n'y a que " - " soit le dernier else, sans avoir testé les autres caractères, le pire c'est que si je retire les fprintf pour les remplacer par des printf ça fonctionne, donc a la limite je dois ajouter quoi pour récupérer ce qui s'affiche dans la console ?
 
Ou est Chralie l'erreur ?
 
Merci ffomnislash (meme si j'ai pas saisi dans le détail ça m'avait aidé pour cette partie de code), et merci a ceux qui se pencheront sur le problème

Reply

Marsh Posté le 19-03-2008 à 17:01:07   

Reply

Marsh Posté le 19-03-2008 à 17:22:29    

Ca fait plaisir de voir que le temps passe a t'expliquer certains trucs ont servi a quelque chose. [:kiki]
 
Je te dirais bien ou est l'erreur, mais en fait non, je l'ai deja fait plus haut et la, j'ai la flemme.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed