Bonjour,
j'ai un probleme avec un projet de bioinfo.
Je suis censé créer une fonction en C qui peut lire des entrées fasta (fichier texte qui stock des séquences protéiques) dans un fichier et puis qui les stocke (je pensais les stocker dans un tableau à 2 dimensions avec dans l'une les identifiants de ma séquence protéique et dans l'autre la séquence en elle meme)
(je comptais aussi créer une structure pour faciliter l'exploitation des données apres)
D'abord voici mon algorithme assez foireux à la base:
Création d'un tableau de chaine de caractere T[0..1,0..N] (N correspondant à mon nombre de protéine dans le fichier, pour l'instant indéterminé)
Lire le fichier fasta ligne par ligne
Alors c'est ici que ça coince: En fait je sais que le mieux serait d'utiliser les piles: empiler quand > et dépiler quand * mais j'avoue que je ne sais pas du tout comment je dois m'y prendre pour coder en C et que ça fonctionne!! Je ne l'ai utiliser qu'en algorithme
Du coup je pensais utiliser une alternative qui s'avere être foireuse aussi!!
Si la ligne commence par ">" copier la ligne dans T[1,i]
sinon tant que non ">" copier la ligne dans T[2,i] en concaténant (et comme la séquence peut etre sur un nombre de ligne variable il faut concaténer)
tant que non "*" ne pas incrémenter (i++ quand la derniere ligne de séquence a été concaténer (elle finit toujours par " * ") )
retourner le tableau rempli
En revanche dans cet algo je ne me suis pas trop préoccupé de la longueur des chaine de caractere dans chaque case de mon tableau, pensant utiliser des pointeurs, mais devrais je allouer dynamiquement de la mémoire? Ou en allouer de maniere plus statique en "tapant" haut, par exemple 600 caracteres (un caractere dans la partie T[2,i] correspond à un acide aminé)?
Dans ce cas il faudrait utiliser la fonction malloc(strlen()): le probleme c'est que les chaines de caracteres varie en fonction du fichier ; je ne sais pas comment faire pour résoudre ce probleme.
Bon voici ce que j'ai codé et qui évidement ne fonctionne pas
>>>>>>>>>STRUCT.H
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> typedef struct { char Table[1][N]; // probleme, N inconnu, c'est le nombre de séquence, ça variera en fonction des fichiers!! char id_seq[N]; //avec id_seq un tableau d'une seule dimension fonctionnant comme un pointeur contenant la chaine de caractere correspondant à l'identifiant de ma séquence ; cette chaine de caractere étant de longueur variable char seq[N]; //meme chose Table[1][N]<-id_seq[N]; // je ne sais absolument pas si j'ai le droit de faire ça dans un typedef struct!!!! Table[2][N]<-seq[N]; }Protein; // oui pas très inspiré pour le nom de ma structure, je n'ai pas trouver qqch de très parlant ^^ char stockData(FILE * pFile); #endif
>>>>>>>>>>>>>fonction stockdata.h (je ne suis pas sure: dois je enregistrer en .h, en .c
est ce que ça suffit de l'avoir déclarer dans struct.h pour que le main arrive à la lire?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 #include "struct.h" char stockData(FILE * pFile) // ici l'idée c'est que ce soit une fonction qui prenne en argument un pointeur vers un fichier; mais je crois que je vais etre obligé de changer pour un argument comme (char file_name[]), non? { FILE * pData= fopen ("pFile", "r", &pFile); // là j'avoue que je ne suis pas sure de moi, je ne pense pas que l'ordi peut comprendre ma commande, c'est une fonction donc je veux généraliser le nom de mon pointeur vers mon fichier (qui est en argument) par ça if (pData[]=NULL) { printf("no data detected\n"); exit(0); } else { printf("the data has been detected\n"); } fscanf("pFiles","%d",&pFile); // je ne sais pas du tout si ça peut fonctionner là non plus, même probleme qu'au dessus i<-0; for (i=0, i<N, i++) if ( fgets(Table, Table<N, &pFile)==">") // je ne sais pas si je peux dre autrement "si la ligne commence par ">" "... { strcopy(fgets() , protein.id_seq[i]); } else { while (fgets() != ">") { strcopy(fgets() , protein.seq[i]); while (fgets() != "*") // là aussi ça peut poser probleme parce que le "*" n'est qu'en toute fin de ligne!! { strcat(fgets(), protein.seq[i]); } } } } fclose(pFile); return Table[]; }
>>>>>>>>>>>> le main.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 #include "struct.h" int main(int argc, char ** argv) { FILE * pData= fopen ("mydoc", "r", &mydoc.fasta); stockData(pData); return 0; }
Voilà j'espere que vous pourrez m'aider! J'ai surtout du mal avec la fonction fgets, je ne vois pas du tout comment l'utiliser ici.
merci d'avoir lu jusque là ^^
Partager