Проблема при открытии файла И, возможно, файла ввода / вывода в строку - PullRequest
2 голосов
/ 26 апреля 2011

Я пытаюсь написать программу, которая будет копировать файл в строку (пока что хорошо), которая будет содержать основы ДНК.Затем базы преобразуются в белки, сначала находя первую последовательность ATG, затем считывая последовательности 3 и преобразуя их, записывая их в другой файл.

На данный момент программа падает перед вводом первого цикла for.. И я не знаю, в чем причина проблемы.

int proteina(char DNA_origem[], char proteina_destino[]){
char aminocidosING [64][14]={"Isoleucine","Isoleucine","Isoleucine","Leucine","Leucine","Leucine","Leucine","Leucine","Leucine","Valine","Valine","Valine","Valine","Phenylalanine","Phenylalanine","Methionine","Cysteine","Cysteine","Alanine","Alanine","Alanine","Alanine","Glycine","Glycine","Glycine","Glycine","Proline","Proline","Proline","Proline","Threonine","Threonine","Threonine","Threonine","Serine","Serine","Serine","Serine","Serine","Serine","Tyrosine","Tyrosine","Tryptophan","Glutamine","Glutamine","Asparagine","Asparagine","Histidine","Histidine","Glutamic acid","Glutamic acid","Aspartic acid","Aspartic acid","Lysine","Lysine","Arginine","Arginine","Arginine","Arginine","Arginine","Arginine","Stop codons","Stop codons","Stop codons"};
char aminocidosPT [64][18]={"Isoleucina","Isoleucina","Isoleucina","Leucina","Leucina","Leucina","Leucina","Leucina","Leucina","Valina","Valina","Valina","Valina","Fenilalanina","Fenilalanina","Metionina","Cisteína","Cisteína","Alanina","Alanina","Alanina","Alanina","Glicina","Glicina","Glicina","Glicina","Prolina","Prolina","Prolina","Prolina","Treonina","Treonina","Treonina","Treonina","Serina","Serina","Serina","Serina","Serina","Serina","Tirosina","Tirosina","Triptofano","Glutamina*","Glutamina","Asparagina","Asparagina","Histidina","Histidina","Ácido glutâmico","Ácido glutâmico","Ácido aspártico","Ácido aspártico","Lisina","Lisina","Arginina","Arginina","Arginina","Arginina","Arginina","Arginina","Códons Stop","Códons Stop","Códons Stop"};
char codoes[64][3]={"ATT","ATC","ATA","CTT","CTC","CTA","CTG","TTA","TTG","GTT","GTC","GTA","GTG","TTT","TTC","ATG","TGT","TGC","GCT","GCC","GCA","GCG","GGT","GGC","GGA","GGG","CCT","CCC","CCA","CCG","ACT","ACC","ACA","ACG","TCT","TCC","TCA","TCG","AGT","AGC","TAT","TAC","TGG","CAA","CAG","AAT","AAC","CAT","CAC","GAA","GAG","GAT","GAC","AAA","AAG","CGT","CGC","CGA","CGG","AGA","AGG","TAA","TAG","TGA"};
char proteinas[64][1] = {"I","I","I","L","L","L","L","L","L","V","V","V","V","F","F","M","C","C","A","A","A","A","G","G","G","G","P","P","P","P","T","T","T","T","S","S","S","S","S","S","Y","Y","W","Q","Q","N","N","H","H","E","E","D","D","K","K","R","R","R","R","R","R",".",".","."};

/* a esta altura suponho que tenhas definido na main as strings dos aminoácidos*/


char **string1; 
FILE * ficheiro;
FILE * ficheiro_close;
int f_cmp; 
int k, i, start=0; /* variavel de comprimento */
char proteina_origem;

ficheiro = fopen(DNA_origem,"r"); /* DNA origem e a variavel onde ta guardada o nome do ficheiro do utilizador */
ficheiro_close = fopen(proteina_destino,"w+");

fscanf(ficheiro,"%c",string1); /* isto lê os conteudos da stream para a string, copiando pra lá o ficheiro. */

for(i=1;i<=f_cmp;i++) {

   if (strncmp(string1[i],codoes[15],3)==0) {
      fputs(proteinas[15],ficheiro_close);

      for(k=i+2;k<=f_cmp;k+3) {

         if ((strncmp(string1[k],codoes[k],3))==0) {
            fputs(proteinas[k],ficheiro_close);

            if (k==61&&k==62&&k==63) {
                return(0);
            }
          }
        }
      }
    }
}

Кроме того, компилятор выдает предупреждение, если я не использую ** в определении символов.Не могли бы вы пролить свет, пожалуйста?Это должен быть простой проект, но я застрял в этой последней функции ..

Не обращайте внимания на имена и комментарии вар, это на португальском языке.

Большое спасибо за вашувремя!

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Если вы используете указатели, то после объявления вы должны инициализировать указатель с подходящей допустимой памятью.После инициализации указатель указывает только на адрес, либо на адрес какой-либо другой переменной, либо на память, которую вы создаете для этого указателя (например, используя malloc () или оператор new).Лучше использовать массив символов, если он не вредит вашему подходу к кодированию для выполнения поставленной задачи.

Однако, если вы объявите string1 как

char** string1

, используйте fscanf следующим образом:

fscanf(ficheiro,"%c", *string1);
0 голосов
/ 26 апреля 2011

Это неправильно:

fscanf(ficheiro,"%c",string1);

Я вижу string1 только объявить, но не инициализирован.

0 голосов
/ 26 апреля 2011

Я полагаю, что одна проблема связана с вашим fscanf вызовом.Вы пытаетесь отсканировать значение и сохранить его в переменной string1, но для string1 не выделена память.Как у вас сейчас, string1 - это просто указатель на указатель на символ, поэтому нет места для хранения фактического строкового значения.Вы можете разместить его в стеке или в куче.Попробуйте что-то вроде этого:

char string1[80]; // Or use whatever size makes sense here

...

fscanf(ficheiro, "%c", string1);

Кроме того, вы, возможно, уже делаете это, но вы должны fclose свои ФАЙЛЫ, когда вы закончите с ними.

...