C ,fscanf(),最后一行被读取两次 [duplicate]

C ,fscanf(), last line is read twice [duplicate]

提问人:Sainath S.R 提问时间:10/26/2014 最后编辑:ChandruSainath S.R 更新时间:10/26/2014 访问量:3545

问:

嗨,我正在为我的系统软件(汇编程序、加载程序等)课程在 C 文件 I/O 中做一个测试程序,我的问题是最后一行被读取了两次,我记得我的老师告诉我这是由于我错过了一些轻微的语法或错误,我忘记了它是什么,请看一下并快速帮助我。

程序

#include<stdio.h>
#include<stdlib.h>
//read from source.txt and write to output.txt

int main()
{
FILE *f1=fopen("source.txt","r");
FILE *f2=fopen("output.txt","w");
int address;
char label[20],opcode[20];
while(!feof(f1))//feof returns 1 if end of file
{
fscanf(f1,"%s\t%s\t%d",label,opcode,&address);
printf("%s\t%s\t%d\n",label,opcode,address);
fprintf(f2,"%s\t%s\t%d\n",label,opcode,address);
}
int check=fclose(f1);
int check2=fclose(f2);
printf("close status %d %d",check,check2);
return 0;
}

来源:.txt

NULL    LDA     4000
ALPHA   STA     5000
BETA    ADD     4020// I stopped right here, DID NOT PRESS 'ENTER' , so that ain’t the issue

输出 .txt

NULL    LDA     4000
ALPHA   STA     5000
BETA    ADD     4020
BETA    ADD     4020

最后一行两次

端子输出

NULL    LDA     4000
ALPHA   STA     5000
BETA    ADD     4020
BETA    ADD     4020

最后一行两次

我不想把最后一行打印或写两次,我做错了什么,救命!

C file-io printf scanf feof

评论

2赞 BLUEPIXY 10/26/2014
!feof(f1)是错误的。EOF 将在读取 scanf 中发生的最后一行后再循环一次。
1赞 Basile Starynkevitch 10/26/2014
您应该测试 fscanf(3) 的结果;此外,在读取之前进行测试是没有意义的。feof
0赞 Sainath S.R 10/26/2014
@BasileStarynkevitch我不精通 C 和文件 I/O,我有 Java 背景,你能为我简单解释一下吗,feof() 测试和返回到底是什么?
2赞 Sainath S.R 10/26/2014
@BLUEPIXY简单来说,我有3行,第三行被读了,EOF还没有设置,因此进入了第四次时间循环,第四次fscanf()尝试,失败,设置EOF指标,但缓冲区或temp字符串中的前一个值仍然存在,其打印,,下一个循环测试失败,停止,我是对的吗?
2赞 BLUEPIXY 10/26/2014
@DroidIcs没错。

答:

2赞 perreal 10/26/2014 #1

您可以使用 的返回值,该值应等于成功扫描的项目数:fscanf

while(fscanf(f1,"%s\t%s\t%d",label,opcode,&address) == 3) {
    printf("%s\t%s\t%d\n",label,opcode,address);
    fprintf(f2,"%s\t%s\t%d\n",label,opcode,address);
}