读取文本文件的 C 代码未找到 EOF(文件结尾)

C code to read a text file does not find EOF (end of file)

我写了这段简短的代码来读取文本文件并将其信息复制到新的 txt 文件,但在此过程中进行了一些字符替换。

我的问题是,代码完成了它应该完成的所有工作,但没有结束。它无法在文件末尾找到 EOF 特殊字符 (arq1) 来告诉它完成处理。

有什么问题?

#include<stdio.h>
#include<stdlib.h>

typedef enum {false, true} Boolean;

int main(){

  FILE *arq1, *arq2;
  char filename[30];
  char first = '*' , second = '*';
  Boolean f_use = false, s_use = false;
  char aux;

  printf("Filename: ");
  scanf("%s", filename);

  arq1 = fopen(filename, "r");
  arq2 = fopen("Codes_out.txt", "w");

  while(fscanf(arq1, "%c", &aux) != EOF && aux != '\n')
    fprintf(arq2, "%c", aux); /*Copy first line*/

  fprintf(arq2, "\n");

  while(aux != EOF){ //#

    printf("Processing new line\n"); // TEST
    f_use = false;
    s_use = false; 

    while(aux != '\t' && aux != ' ' && aux != EOF){ /* Copy locus ID*/
      printf("%c", aux);//TEST
      fscanf(arq1, "%c", &aux);
      fprintf(arq2, "%c", aux);
      printf("Copying ID\n");//TEST
    }
    printf("ID copied\n");//TEST

  while(fscanf(arq1, "%c", &aux) != EOF && aux != '\n'){ //##

      /*If a code for nitrogen base is found, identify
    as first or second state and substitute 
    for a numeric code (1 or 2)*/
      if(aux == 'C' || aux == 'G' || aux == 'A' || aux == 'T' ||
     aux == 'c' || aux == 'g' || aux == 'a' || aux == 't'){

    if(f_use == false){ 
      /*First base not yet identified*/
      first = aux;
      f_use = true;
      printf("OK 6a\n\n"); //TEST
      printf("first = %c\n", first); //TEST
    }
    else if(s_use == false && aux != first){  
      /*second base not yet identified
        and aux different from first base*/
      second = aux;
      s_use = true;
      printf("OK 6b\n\n"); //TEST
      printf("second = %c\n", second); //TEST
    }

    if(aux == first){
      fprintf(arq2, "1");
      printf("OK 5a\n\n"); //TEST
    }
    else if(aux == second){
      fprintf(arq2, "2");
      printf("OK 5b\n\n"); //TEST
    }
  }

  else if(aux == ' ')
    fprintf(arq2, "%c", aux);

  else if(aux == 'N' || aux == 'n')
    fprintf(arq2, "%c", aux);

  else
    fprintf(arq2, "3");

  } //##
  printf("%c ", aux);
  fprintf(arq2, "\n"); /*add line break*/
  printf("OK 7\n\n"); // //TEST
} //#

printf("Processing finished\n"); //Control
fclose(arq1);
fclose(arq2);

return 0;
}

Here is the link for the input file

EOF 不是字符,您不能尝试用 fscanf(arq1, "%c", &eof); 读取它,您应该检查 fscanf() 的 return 值,这可能是EOF 或匹配参数的数量。

试试这样的东西

int status;

while ((status = fscanf(arq1, "%c", &aux)) != EOF)
{
 .
 .
if (status == 1)
    fprintf(arq2, "%c", aux);
 .
 .
}

还有很长一段时间 if 我会推荐这个

switch (aux)
{
case 'C':
case 'G':
case 'A':
case 'T':
case 'c':
case 'g':
case 'a':
case 't':
    /* code here */
    break;
}

使用feof( arqN )函数检查文件结尾。 EOF 代码 (0x1A) 不存在于所有文本文件中。