读取文本文件的 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;
}
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) 不存在于所有文本文件中。
我写了这段简短的代码来读取文本文件并将其信息复制到新的 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;
}
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) 不存在于所有文本文件中。