【问题标题】:C ,fscanf(), last line is read twice [duplicate]C,fscanf(),最后一行被读取两次[重复]
【发布时间】:2014-12-21 15:23:16
【问题描述】:

嗨,我正在为我的系统软件(汇编程序、加载程序等)课程在 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;
}

source.txt

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

output.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

//最后一行两次

我不希望最后一行被打印或写两次,我做错了什么,求助!

【问题讨论】:

  • !feof(f1) 是错误的。 EOF 将在读取 scanf 时发生读取最后一行后再循环一次。
  • 你应该测试fscanf(3)的结果;在任何阅读之前测试 feof 也是没有意义的。
  • @BasileStarynkevitch 我对C&文件I/O不太熟悉,我有Java背景,能不能简单的给我讲讲,feof()到底测试和返回什么?
  • @BLUEPIXY 简单地说,我有 3 行,读取第三行,尚未设置 EOF,因此进入第四次循环,第四次 fscanf() 尝试,失败,设置 EOF 指示器,但是缓冲区或临时字符串中的先前值仍然存在,其打印,下一个循环测试失败,停止,我正确吗?
  • @DroidIcs 没错。

标签: c file-io printf scanf feof


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 2021-12-05
    • 2011-05-18
    • 1970-01-01
    • 2018-01-08
    • 2017-06-14
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    相关资源
    最近更新 更多