【问题标题】:Problem when opening file AND possibly file i/o to string打开文件和可能文件 i/o 到字符串时出现问题
【发布时间】:2011-04-26 03:44:25
【问题描述】:

我正在尝试编写一个程序,它将一个文件复制到一个包含 DNA 碱基的字符串中(到目前为止还不错)。然后将碱基转换为蛋白质,首先找到第一个 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);
            }
          }
        }
      }
    }
}

此外,如果我在 char 定义中不使用 **,编译器会发出警告。你能解释一下吗?这应该只是一个简单的项目,但我被困在最后一个功能中..

不要介意 var 名称和 cmets,它是葡萄牙语。

非常感谢您的宝贵时间!

【问题讨论】:

  • 在使用之前确保ficheiro 是一个有效的文件指针(通过检查if(ficheiro)
  • 我之前有一个 printf 来测试,打印出变量,它就像一个魅力。
  • 还有一点代码缺失,但还是不行,以防万一,在for循环之前f_cmp=strlen(*string1);
  • 好的,那可能不是这样,但你还是应该检查你的文件指针:)
  • String1 在很多方面都困扰着我,因为首先它被用作 fscanf 中的一个字符。然后你尝试通过取消引用它来像字符串一样使用它,但它不是一个字符串......并且你跳过了第 0 个成员(数组从 C 中的 0 到 size-1),所以你可能会超过结尾。跨度>

标签: c++ arrays string char


【解决方案1】:

如果你使用指针,那么在声明之后你必须用合适的有效内存初始化指针。初始化后,指针只指向一个地址,要么指向其他变量的地址,要么指向您为此指针创建的内存(例如,使用 malloc() 或 new 运算符)。 最好使用 char 数组,如果它不会损害您完成手头任务的编码方法。

但是,如果您将 string1 声明为

字符**字符串1

像这样使用 fscanf:

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

【讨论】:

  • 当只声明一个指针时,它根本不指向地址。
  • @DaRk_f0x:尝试使用 cin>> 或 getline() 代替 fscanf,或者使用 fstream 对象从文件中读取,因为这样更方便。但这是我的建议,由您决定哪个更适合。
【解决方案2】:

我相信您的fscanf 电话有一个问题。您正在尝试扫描一个值并将其存储在 string1 变量中,但没有为 string1 分配内存。正如你现在所拥有的,string1 只是一个指向 char 指针的指针,因此没有地方可以存储实际的字符串值。您可以在堆栈上分配它,也可以在堆上分配它。试试这样的:

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

...

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

此外,您可能已经这样做了,但您应该在使用完文件后fclose 文件。

【讨论】:

  • 我让程序使用char string1[10] 运行,但它仍然无法运行,可能是因为文件大小未知?在字符串中,它将是 1200 多个字符。
  • 而且文件从来没有固定大小,因为我之前成功使用过 char string[],但似乎未知大小可能是问题..
  • @DaRk_f0x:不要羞于让字符串足够大 - 例如16384, 65536 - 它在堆栈上,将在函数退出时被回收。但是: %c 只读取一个字符 - 您可能想要 "%s" 或 "%[xyz]" - 请阅读您的 scanf 联机帮助页。更好的是,使用 C++ 的机制:if (std::ifstream ficheiro(DNA_origem)) { std::string string1; if (std::getline(ficheiro, string1)) { ... } }std::string 可以增长到任何大小。你的文件真的只有一行吗?
  • @OP:您想使用 fscanf 逐行阅读吗?这是一个坏主意,除非您想从文件中进行标记化读取。对于阅读行使用 fgets 功能。如果您需要事先知道文件的大小,请使用 stat 函数获取与文件关联的所有属性/参数..其中包括文件大小(以字节为单位)。
  • 这是我女朋友班级的一个项目,老师反对他们使用更高级的东西。我应该只使用 fputc 和 fgetc 等来设计循环,甚至 fcnaf 都不能使用如果我听了那个人说的所有内容,通常会允许一个字符串。但是我无法让它与这样的基本命令一起工作,因为我必须在 3 个块中寻找 =\
【解决方案3】:

这是错误的:

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

我看到 string1 仅声明但未初始化。

【讨论】:

  • 我不确定我明白你的意思:S
  • 正如其他人所说。 char ** string1 需要指向一些内存..无论是在堆栈上还是在堆上。由于您还没有完成任何操作..fscanf 将失败。
猜你喜欢
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多